ちゅらアドベントカレンダー 25日目最終日の記事です。
軽く自己紹介
初投稿です。
どうもこんにちは、ちゅらデータでデータサイエンティストをしております、クリスマスの午前に健康診断を申し込んだところクリスマスイブにろくなものを食えない思いをしたkon03と言います。
今回まさかのトリを飾ることになりました。
Qiitaも書いたことないようなペーペーの人間が、社長などに一切気を使わずに最終日をもらえる(早い者勝ちなのは内緒)ところから弊社がいかにフラットな組織であるかを、声を大にしてお伝えしたい次第です。
ちなみにそんな会社を作った社長は、去年トリでしたが、まだ投稿されていません...(2024/12/25 19時現在)
はじめに
弊社では、ちゅらいとと呼ばれるAI文章校正ツールをリリースしています。この中で私は、主にAIモデルの改善に勤しんでおります。
このモデル改善のために、弊社では今年の6月にGPUマシンを購入いたしました。RTX6000Ada×4枚を積んだ、かなり強力なマシンです。
このマシンにはOSとしてWindows11 Proが入っており、当初はWSLにて環境を作っておりましたが、そこで起きた不具合について、日本語の記事がないのでまとめさせていただきます。
この記事で書かないこと
- マルチGPUマシンの詳細なセッティング手順
最初にまとめ
- WSLは描画で使っているGPUを学習に使ってくれない
- sshやネットワークの設定していない状態でこうなると、会社で使うときに死ぬほど困る
- 大人しく、Ubutntuをデュアルブートしよう!
経緯
弊社でGPUマシンを買おうとなったのは去年の11月頃です。それから業者の選定・見積もり・社内の調整を経て、ようやく今年の6月に購入することができました。その後、3ヶ月ほど電源などの事情により動かせない時間が続き、結局稼働したのは今年の9月でした。
私はこのマシンの手配をしたため、自動的に管理者のようなものになっており、このマシンにて学習環境を整えることは急務でした。
WSLを入れ、Dockerを入れ、cudaを入れとやっていくと、以下のような不具合に直面しました。
マルチGPUマシンでWSLで起きている不具合
簡単なpytorchのコードを用意しました。
import torch
print(f"CUDA is available: {torch.cuda.is_available()}")
print(f"CUDA device count: {torch.cuda.device_count()}")
print(f"CUDA version: {torch.version.cuda}")
if torch.cuda.is_available():
device = torch.device("cuda")
x = torch.randn(1000, 1000, device=device)
print("CUDA tensor created successfully")
4枚のGPUがあるので、以下のように表示してくれるとちゃんと設定できるわけです。
CUDA is available: True
CUDA device count: 4
CUDA version: 12.1
CUDA tensor created successfully
しかし、実際には以下のエラーが出てきます。
/home/kon03/.local/lib/python3.10/site-packages/torch/cuda/__init__.py:118: UserWarning: CUDA initialization: Unexpected error from cudaGetDeviceCount(). Did you run some cuda functions before calling NumCudaDevices() that might have already set an error? Error 2: out of memory (Triggered internally at ../c10/cuda/CUDAFunctions.cpp:108.)
return torch._C._cuda_getDeviceCount() > 0
CUDA is available: False
CUDA device count: 4
CUDA version: 12.1
ここで問題なのはCUDA is available: False
です。nvidia-smi
を実行してもちゃんとGPUは4つありますし、nvccなんかもインストールしています。
環境の再構築をしてもエラーは変わりません。GoogleさんやChatGPTといったLLMくんに聞いても、環境の再構築ぐらいしかまともそうな答えが返ってきません。
半ば諦めかけていた時に、ふと思いました。
「もしかしてGPUで壊れているものがある?」
と、
試しに以下で実行してみたところビンゴでした。
$ export CUDA_VISIBLE_DEVICES=1,2,3
$ python3 test.py
CUDA is available: True
CUDA device count: 3
CUDA version: 12.1
CUDA tensor created successfully
つまり0番のGPUだけが使えないというわけです。ここまで来るとGoogleさんに聞くことも違ってくるので、同様の問題を発見することができました。
https://forums.developer.nvidia.com/t/quad-4x-a6000-wsl2-cuda-init-errors/238106
https://github.com/docker/for-win/issues/13658
この人たちもGPUの番号は違いますが、同じ問題に直面しています。
解決方法
Ubutntuをデュアルブートする。
以上。
余談
私はこれで土日を潰しました。
この記事はちゅらいとにて校正されています。