Category: AI

【python】Optunaの使い方練習

こんにちは。今回はDeep Learningにおいて重要なニューラルネットワークのハイパーパラメータを自動で提案してくれるライブラリ、Optunaについてまとめていきます。これは、スパゲティコードの治療回にて供養が必要となった勉強用プログラムの第一弾です。ソースコードはここに載せています。それでは早速観ていきましょう。 プログラムの概要図 このプログラムは大きく分けて2種類のプログラムから構成されます。一つはニューラルネットワークの構成(ハイパーパラメータ)を決定するプログラム、もう一つはその結果をもとに実際にニューラルネットワークを作成するプログラムです。この2つのプログラムは両方ともデータ生成プログラムをimportしているために、下記の通り構造がやや複雑になっています。 小話 これを実装するにあたり、TuningHyperParameter.pyとload_studyから呼ばれているData_preparing.py、およびそこから呼び出されているCalculate_payoff.pyは2つまとめてlibraryフォルダを用意して分けました。したがってdirectory直下にはTuningHyperparameter.py, load_study.py, dataフォルダ, libraryフォルダしかありません。よって半年ぶりにこのコードを読んだ時も、TuninghyperParameter.pyとload_study.pyの関係さえ思い出せればなんとかプログラム設計を読み解くことができました。でも、上図をREADMEに添付するだけでこんなのはわかるので、いかにドキュメンテーションが大切か思い知らされますね。 TuningHyperParameter.pyの概要 このプログラムの中にはTQNetworkクラス(Tuning Q networkより)が用意されていて、何もなければオブジェクト作成時に下記のrun_study_mainが走るようになっています。 run_study_main() study = optuna.create_study()、study.optimize()の行が一番大切で、そこでハイパーパラメータの探索回数や結果の保存場所を規定しています。それ以外は探索結果のパラメータを表示する部分なので対して重要では無いですが、study.best_trialで各種パラメータが返ってくるのが便利ですね。詳細はoptuna.study.Studyのリファレンスを参照。ちなみに上記プログラム中で出てくるself.objectiveは同クラス内の別の関数を指しています。それが下記です。 objective() これだけ読んでもさっぱりだとは思いますが、最初の7行でデータを作成して、次の2行でモデルとoptimizerの候補を作り、optuna君に学習最適化をしてもらってmodelとoptimizerを最適化するという流れになっていることだけ分かれば良いと思います。このコードを丸コピする場合もdata_creator関数を自分用に改造すれば同じコードで行けるはずです。 create_model() ここでは実際にニューラルネットワークのレイヤ数をいくつにするか、ノードをいくつにするか、weight_decayをいくつにするかなどを探索できるようにしています。optunaから呼び出される細かい数値は変更可能ですが構成はあまり変える必要はないかなと思っています。 create_optimizer() optimizerについても探索させることができますが、正直Adamで固定しても良いかなと思っています。このコードを書いたときは探索させる気があったのでcreate_model()と同様の書き方で実装しています。この部分で重要なのはlearning_rateのチューニングです。学習率は低すぎても高すぎてもうまく行かないので、Optunaのような自動探索機に決めてもらえるのは結構嬉しい。 load_study.pyの概要 create_model() load_studyの主要部分であるこの関数、実はTuningHyperParameter.pyのcreate_model()とほぼ同じです。違う点は、探索結果のstudyから最適値をもらってmodelを構成する点です。一応下記にコードを載せて置きます。 learn_main() モデルを作ることができたら、それを使って学習を行います。これはごくフツーのmodel.fit()で良いので簡単です。学習が終わったらmodel.save()で保存して終了です。 まとめ スパゲティコード供養第一弾ということで、Optunaの使い方と応用を紹介させていただきました。自分のコードの稚拙さや改善ポイントの多さに気付かされますね。俺・・頭痛が治ったら、もっとちゃんとドキュメンテーションしながらプログラムを組むんだ・・(強い決意)。ということで、千里の道も一歩から。次回もお楽しみに。

Ubuntuのカスタマイズ #2.5 Tensorflow-GPU(GTX-3080ti固有のバグ?)

こんにちは。最近頭痛に対抗して運動をしているRockinWoolです。会社から休職の手当と書類が送られてくるのですが、よりにもよって体調を崩す原因となった上司から送られてくるので、毎回憂鬱になります。個人的にはお金をいただけても全然嬉しくないというか、理不尽な目に合わなければ頭痛とお付き合いする必要もなかったしお金ももっと入っていただろうので、単純に互いに損しているだけなんですよね。 さて、今日はちょっと前に上げていたTensorflow-GPUのセットアップが固有のGPUでは失敗する現象を発見したので、これについて解決策を補足させていただきます。 GTX-3080Tiを積んだPCでTensorflow-gpuがセットアップできない まずはバグの概要から。上記GPUを積んだ状態でTensorflow-gpuをインストールすると次のような状況に遭遇します。なおlibdevice not found at ./libdevice.10.bcの問題は既に解決済みであるとします。上記エラーの解決方法は前回記事を参考にしてください。 エラーメッセージは下記の通りです。 正: ptxasが足りていない, 誤: ptxasが起動できない さて、エラーメッセージが出たらまずは同様の事例が無いかWebで確認!(クソザコ思考)。似たようなエラーとしてはここのIssueなんかがありました。解決法として、ptxasへのPATHを追加することが挙げられていたので早速挑戦してみると・・・、あれ?find / -name "*ptxas*"で何もヒットしないぞ?しかもエラーメッセージに書いてあるnvptx_compilerすらヒットしない。これは、つまりパッケージが足りていないということでは? condaでcuda-nvvcをインストールする必要があった さて、パッケージが不足していることは分かったのですが、それじゃあ一体何を入れれば良いのかということになりました。ということで、心当たりのあるパッケージを一通り入れたり外したりした結果、最終的にはここに書いてある下記のコードを実行する必要があったという結論になりました。 このためだけに、Ubuntuの再インストールとかいろいろ大規模に調査したのですが、結果としてはtensorflow-gpuのインストール時にcuda-nvccが自動的に入らないことが問題だったようです。こんなの他にも同じような症状の人が発生しそうですね・・。 まとめ とりあえずINTERNAL: Failed to launch ptxasのエラーで悩んでいる方はconda install -c nvidia cuda-nvccでnvccをインストールすることを試してみてください。今の所固有GPUでのエラーっぽいのですが、より多くの人がこの方法で救われると嬉しいですね。解決方法発見までのプロセスについてもツッコミがあれば改善したいと思います。ここまで読んでくれてありがとうございました。

Ubuntuのカスタマイズ #2 Chrome, VSCode, ,Anaconda, Tensorflow-GPU

休職を始めてそろそろ3週間が経とうとしていて、時の流れとは速いものだと感じています。原因となった頭痛は消えていませんが、まだ3週間ならしょうがないかな。さて、今回はUbuntuのカスタマイズ編の2回目ということでTensorflow-GPUのインストールまでを解説します。というより、これをインストールするためにUbuntu22.04をUbuntu20.04にダウングレードしたりするなど多いに格闘したので、備忘録として残しておきます。 Chrome, VSCode, Anacondaのインストール 北陸先端科学技術大学院大学、通称JAISTさんは、Ubuntuを日本語化したイメージを配布しております。このUbuntuをクリーンインストールしたら最初にやるべきことはChrome, VSCodeのインストールと個人的に思っています。また、このイメージにはデフォルトでcurlとgitが入っていないので、それらも最初に入れてしまえば良いです。主な流れは下記の通りです。 ここまでやれば、一通りの環境構築が完了します。ちなみに、私はAnacondaではなくnativeにPythonを配置する方が好きなので、今回の構築はTensorflow-GPUのためにやむ無しという感じで実施しました。 Tensorflow-GPUのインストール 今回、最初はAnacondaを使用せずにTensorflow-GPUを導入することを検討していました。上述の通り、私はAnacondaに苦手意識を持っていたというか、condaコマンドを覚えることが何故かできなくて毎回調べなければいけないことが苦痛でした。しかし、nvidiaの公開しているGPUドライバ、CUDAなどのインストールを手動でやってもなかなか上手く行かなく苦しみました。したがって、皆様には最初からAnacondaを使って環境構築をしてしまうことをおすすめします。(それでも終盤で手動設定が必要な場所があって苦労したのですが) Tensorflow-gpuを動作させる環境の作成 tensorflowでGPUを使う設定(Anacondaを使用)さんが参考になります。ただし、内容が少し古くなってしまっているので、こちらで補足します。まず、condaコマンドでtensorflow-gpuが動作可能な環境を構築します。 conda create -n tf2110 tensorflow=2.11.0=gpu_py39h6d58c08_0 ここで重要なのは最新版のtensorflowを指定した点になります。最新かどうかはconda search tensorflowでの出力から確認できます。この中でgpu_py**となっているものがGPU対応のtensorflowになります。今回の目的はTensorflow-gpuの環境構築なのでこちらを選択しております。 補足: なぜ最新版を選択するのか optunaでweight_decayをパラメータに設定している場合、weight_decayが2.11からしか設定されていないために古いtensorflowでは動作しないというパターンにぶつかりました。そのため、可能な限り最新版を選択してこのような苦しみを避けることが大切だと思います。この問題についてはQA等はみつかりませんでしたが、公式ページからweight_decayが追加された時期を確認できます。 libdevice not found at ./libdevice.10.bcへの対策 さて、tensorflow-gpuも無事にインストールできたし、基本的なプログラムなら上手く動作しているから安心安心。。と思っていたら表題のようなエラーメッセージが出てきてしまった。これについて調べて見ると同じようなGithubのIssueがあることが判明した。提案されている解決法の殆どは上手く行かないのだが、最後の方にあるSolutions so Farのみ上手く作用したので、ここでも載せておく。まずは提案されている生コードを下記に示す。…

Chatgpt: 神だけど嘘をつく

仕事において、コンテナ内からGithubに対してssh接続をしたいケースが発生しました。その際、とりあえずChatGPTに聞いてみるのはどうかな?と思い早速使ってみました。結果的には嘘をついたりするので素直には解決しなかったのですが、まあこれはこれで非常に勉強になりました。特に弊部署には先輩と言える先輩がいないため、自然とこの子に聞くことが多くなるんだろうなと思う次第。 それでは本題に入ります。まず、ChatGPTくんは英語が得意なので英語で質問を入力することにしています。そうした方が精度もスピードも断然良いです。下記が会話になります。 上記に対するchatGPTくんの回答はこちら ここまでの会話で、「確かにホストと共有したボリュームにしてしまえば行けるじゃん」と納得してしまいました。このあとにぶつかる大きな問題にも気づかずに….。ちなみにこのときは英語の回答を読み間違えて、コンテナ間でもssh通信するのかな?と思い素っ頓狂な質問もしています。 ChatGPTくんすごい!と思う一方で、ここの6番の回答で「そういえば。。。」となりました。SSH関連のファイルは権限管理がとても厳密で600とか400じゃないと動作しないんじゃなかったかな?そういえばDockerコンテナ内のユーザはホストのルートでは無いから、600とかに指定されてしまうと書き込めないのでは? そしてChatGPTくんとの戦いが始まった。 ここで実際にChatGPTの言うとおりにコンテナを試しに作ってみて、SSHできるか試してみました。その際、known_listが更新できない(権限が無いため)という問題に早速ぶつかりました。下記がChatGPTくんとのやり取りです。 キャプションでは解説が難しいため、ここでは本文に問題点を書いていきます。まず、解決手順そのものは非常に妥当です。鍵が正しいかを確認し、その権限が合っているか確認する、この動きは間違っていないと思います。ただし、確認方法が今回の本題になります。コンテナの中から見ると確かに権限は合っています。しかし、これはコンテナのルートユーザを基準にした権限ではなく、ホストのルートユーザを基準としているため、コンテナのルートユーザには書き込み権限が無いです。つまり、この手順に沿って見ていっても解決できないのです。少しコーナーケースだと性能が落ちるのかも知れない・・・。 そんなこんなで、 こんな感じで解決していくことになりました。以降はDockerfile内にどうやって現在のユーザのホームディレクトリ(通常~や$HOME)を記載するかについて、質問しています。これはsshのデフォルト保存先が~/.ssh/であることに起因しています。 ちなみにこの回答、全くの嘘です。ひどい話です。全然これでは機能してくれないので注意。 尤もらしく書いているので騙されてしまいましたが、実際にやってみるとことごとく失敗します。そこで、ChatGPTくんに事実を伝えました。 ということで、docker buildコマンドには –build-argsオプションがあり、これで指定できる変数はDockerfileであらかじめARGで指定できるのでいかが?と返ってきました。確かにこれは使えそう!ありがとうChatGPT! 結果的には他の鍵がおいてある~/.ssh/を明示的に指定するのも怖かったので、build argを使用しない方法で実装することになった。ただ、知識がついたのでこういう試行錯誤のお供にChatGPTは最高だね!という結論にします。 これからもよろしく!ChatGPTくん。そして、ここまで読んでくださった辛抱強い皆様に感謝!