きょうも亀だけど

機械学習やデータサイエンスの勉強記録など

PyTorchでCUDAを使ってGPUで学習をさせたときに「Expected all tensors to be on the same device, but found at least two devices」が出たときの対処

GPUを積んだローカルPCでPyTorchの転移学習を試した。以下を参考にCUDAでGPUを使用して学習させた。

www.amazon.co.jp

結果、Optimizerの実行箇所でタイトルのエラーが発生した。
tensor使うなら全部GPUでやらなきゃいけないのにCPUが混ざってるぞ」と言われているのは分かったけど対処法がわからない。

optimizer.to(device)

とやってみたけどダメ。 最終的に以下のページにたどり着いた。

discuss.pytorch.org

以下の関数を定義した。

def optimizer_to(optim, device):
    for param in optim.state.values():
        # Not sure there are any global tensors in the state dict
        if isinstance(param, torch.Tensor):
            param.data = param.data.to(device)
            if param._grad is not None:
                param._grad.data = param._grad.data.to(device)
        elif isinstance(param, dict):
            for subparam in param.values():
                if isinstance(subparam, torch.Tensor):
                    subparam.data = subparam.data.to(device)
                    if subparam._grad is not None:
                        subparam._grad.data = subparam._grad.data.to(device)

その後、

optimizer_to(optimizer, device)

としたことで無事学習が完了した。 ありがとう、ハンス。

Anacondaの仮想環境配置ディレクトリを変更し、仮想環境を立てる

Anacondaを使って仮想環境を作る。これによりライブラリのバージョンの混在を防ぎ、各作業の環境を独立させられる。 仮想環境の配置ディレクトリをCドライブ以外にしたかったので、以下の方法で配置ディレクトリを別ドライブに設定した。

【参考】
blog.sgry.jp

環境変数「CONDA_ENVS_PATH」に配置ディレクトリパスを設定し、無事成功した。

次に、作成した環境をGit管理できるようにするため、環境設定ファイルを以下のコマンドでAnaconda Promptから出力した。 ymlファイルはコマンド実行時のディレクトリに出力される。

conda env export > env.yml

これをAnaconda NavigatorのEnvironmentsからImportすれば、環境の復元ができる。

【参考】
qiita.com

作成したEnvironmentsにJupyter Notebookをインストールする。 インストールした環境で実行したJupyter Notebookでは、その環境に存在するライブラリのみを使用できる。 別環境で作ったNotebookであったとしても、実行している環境のライブラリを参照する。 f:id:OnsenTamagoYoshi:20201024022147p:plain

環境分けられるのはめっちゃ便利。 作り直すのも簡単そうではかどる。

Anacondaインストール後にJupyter Notebookをコマンドプロンプトから起動する

Anacondaを入れ直した後、コマンドプロンプトで起動すると「DLL load failed」が出て起動できなかった。
以下の記事を参考に環境変数を設定し、順番も整理したら無事起動した。

【参考】
qiita.com

Bitbucketへの登録をせずにSourcetreeをインストールする

PCの新調に伴って開発環境を作り直した。
Sourcetreeのver3をインストールしようとしたところ、以前はなかったBitbucketへの登録が必須となっていた。
使うのはGitHubだし、登録なしで進めないか調べたところ、以下を参考にアーカイブからver2を取得してインストールしてからver3にアップデートする方法でいけた。

hepokon365.hatenablog.com

一部の行を削除後のdataframeに対してscikit-learnのmean_squared_errorを実行すると「Input contains NaN, infinity or a value too large for dtype('float64').」が発生した時の対処法

dataframeに対し、以下のように指定のデータを削除した。 その後、そのデータに対してLightGBMで学習させ、その過程でmean_squared_errorをかけるとタイトルのエラーが発生した。

df_train = df_train[df_train['target'] > 500]

以下のサイトを参考に、データ削除後にindexをリセットしたらエラーが出なくなった。 www.it-swarm.dev

df_train = df_train.reset_index(drop=True)

AtCoder Beginner Contest 174, 175, 176参戦

ABC3つに参加した。

AtCoder Beginner Contest 174

A, B, Dの3完で終了。Cは数学的な知識を使うんだろうなというのは読めたけど見いだせず。解法見てなるほどなと納得した。

github.com

AtCoder Beginner Contest 175

A, B, Cの3完で終了。解けたけど時間かかりすぎた感じ。パフォーマンスを上げるには、解ける問題をいかに早く解くかが重要と認識した。

github.com

AtCoder Beginner Contest 176

A, B, Cの3完で終了。Dは探索系というのは分かったけど、どこでワープさせるかの判定方法が全く思いつかず。アルゴリズムを勉強しないとこの辺りは戦えない。

github.com

アルゴリズムの勉強の優先度を高められる状況ではないので、継続的に参加することに注力する。

AtCoder M-SOLUTIONS プロコンオープン 2020参戦

A, B, C, Dの4完で終了。PCが起動しなくて初動10分遅れで焦った。Dまでは簡単だったけど少し時間がかかりすぎた。C以上をいかに速く解けるようになるかが次の課題。 また、リストへのアクセスが多いと計算量的にイケると思ってもTLEになってしまう。ループ内でappendする処理になったら少し考えた方がいいかもしれない。

github.com