【WSL2 + docker + CUDA】Kaggle docker imageでGPU環境構築
前提
Microsoftのインストールガイド
を参考に
は済んでいるものとします。
1.実行環境
- OS:Windows10 Home (OSビルド:21376.1)
- Windows Insider Program:Devチャンネル
- CPU:AMD Ryzen 7 3700X 8-Core Processor
- GPU:NVIDIA GeForce RTX 2070 super -Linux ディストリビューション:Ubuntu-18.04 -CUDA driver version:470.14 -CUDA tool kit version:11.3
2.Linuxディストリビューションのインストール
コマンドプロンプトを開いて以下のコマンドを入力するとUbuntu-18.04がインストールされます。
$ wsl --install -d Ubuntu-18.04
終了すると、Ubuntu-18.04のターミナルが自動的に起動するのでユーザー名とパスワードを入力してください。
このコマンドで以下の処理が実行されます。
- 「Linux 用 Windows サブシステム (WSL)」と「仮想マシン プラットフォーム」の有効化
- 最新の Linux カーネルのダウンロード・インストール
- WSL 2 を既定値として設定
- 指定の Linux ディストリビューション (この場合 Ubuntu 20.04) のダウンロード・インストール
3. CUDA on WSLのインストール
以下のリンクからお手持ちのGPUのシリーズ(Gerforce or Quadro)に合わせたインストーラーをダウンロードできます。
GPU in Windows Subsystem for Linux (WSL) | NVIDIA Developerdeveloper.nvidia.com
これが済んだら、インストーラーを開くとインストールされていきます。
※ゲーミングPCなどを持っていて最初からNVIDIAまわりのソフトが入っている場合はカスタムインストールを選択してクリーンインストールを選ぶと上手くいきます。
4.CUDA Toolkitのインストール
2でインストールしたUbuntu18.04で以下のコマンドを実行していきます。
ここで、cuda-toolkitのバージョンはPower Shellなどを開いてnvidia-smiから確認してください。
$ apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub $ sh -c 'echo "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/cuda.list' $ sudo apt-get update $ sudo apt-get install -y cuda-toolkit-11-3
5.CUDAアプリケーションの実行
ここまでの作業でWSL上でCUDAプログラムを動かせる確認するために以下のコマンドを実行してください。
$ cd /usr/local/cuda/samples/4_Finance/BlackScholes $ sudo make $ ./BlackScholes
図のようにTest passedと出れば問題なく実行できています。
5.dockerのインストール
以下のコマンドでdockerがインストールされます。
$ curl https://get.docker.com | sh
実行すると、docker desktop for windowsをおススメします的な文が表示されますが無視してください。
NVIDIAのドキュメントによると。docker desktopはWSLはサポートしていますが、GPU関連はまだサポートしていないようです。
6. NVIDIA Container Toolkitのインストール
普通にインストールすると、GPGキーが安定版を選んでしまうのでプレビュー版をインストールするように以下のコマンドを実行します。
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) $ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - $ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list $ curl -s -L https://nvidia.github.io/libnvidia-container/experimental/$distribution/libnvidia-container-experimental.list | sudo tee /etc/apt/sources.list.d/libnvidia-container-experimental.list $ sudo apt-get update $ sudo apt-get install -y nvidia-docker2
7.CUDAコンテナのビルド
これでdocker上でGPUが使えるはずなので、試しにCUDAコンテナを実行してみます。
$ sudo service docker start $ sudo docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
普通はこれで無事にビルドされるのですが、私の場合は以下のエラーがでました。。。
$ sudo docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"process_linux.go:432: running prestart hook 0 caused \\\"error running hook: exit status 1, stdout: , stderr: nvidia-container-cli: initialization error: driver error: failed to process request unknown. ERRO[0000] error waiting for container: context canceled
このエラーはNVIDIA側も認知しているようで、CUDA on WSL2フォーラムを読みまくったところ次のようにすれば無事にビルドできました。
$ apt-get install \ libnvidia-container1=1.3.3~rc.2-1 \ libnvidia-container-tools=1.3.3~rc.2-1 \ nvidia-container-toolkit=1.4.1-1 \ nvidia-container-runtime=3.4.1-1 \ nvidia-docker2=2.5.0-1 $ sudo docker service stop $ sudo docker service start $ sudo docker run -it --gpus all --env NVIDIA_DISABLE_REQUIRE=1 nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
8.Kaggle docker imageのビルド
ここまでくれば後は簡単です。次のコマンドで最新のkaggle notebookと同様の環境構築ができます。
$ sudo docker run -it --gpus all --env NVIDIA_DISABLE_REQUIRE=1 gcr.io/kaggle-gpu-images/python:latest
参考記事
【超伝導量子回路】LC並列共振器の量子化
超伝導回路の基本的な構成要素であるLC並列共振器を量子的に扱うためにこの計算が必要になります。ここからの説明は解析力学と量子力学,
簡単な電気回路の知識を前提として書いています。
まず、図のようなLC回路を考えることにします。
回路に流れる電流の大きさを、電圧を、キャパシタに蓄えられている電荷を、コイルを貫く磁束をとし、それぞれの素子について以下の式が成り立ちます。
(1)、(2)より、
が得られ、(5)をさらに時間微分すれば、(3)、(4)より、に関する微分方程式が得られます。
ここで、(2)で出てきた磁束は無限の過去でとして、
を満たす物理量です。
また、共振周波数を求めておきます。図1のインピーダンスは、虚数単位、誘導性リアクタンス、容量性リアクタンスをそれぞれとして、
LC並列回路の共振条件はインピーダンスが最大、つまり、の虚部が無限大になる場合なので、以下の方程式をについて解けば、
共振角周波数が得られます。
次に式(6)を満たすラグランジアンを求めます。調和振動子におけるニュートンの運動方程式
と式(6)を比較します。 、、だと思えば、は、
と表すことができます。ここから、の正準共役変数を求めると、
となり、ハミルトニアンは、
となります。後に出てくる生成・消滅演算子の導入で必要になるので上のように式変形をしました。
、として演算子に置き換えると、ハミルトニアンもとなり、
で表されます。また、具体的に演算子、は、
を満たします。次に生成・消滅演算子、を定義する.式(13)の{}の部分をそれぞれ、
とおいて、を計算すると、
となる.両辺にを掛ければ、
よって、LC並列共振回路のハミルトニアンを生成・消滅演算子で式(21)のように表すことができます。
また、式(18), (19)を用いて、もで以下のように書くことができます。
(18) (19)より、
(18) (19)より、
ここから、も
として表すことができます。以上の計算でLC並列共振器の量子化ができました。
【統計力学】1変数のキュミュラント展開
1変数のキュミュラント展開
をパラメータ, を確率変数として,
としてを定義する.ここで確率変数xの取りうる範囲は, 確率分布関数をとすると(1)の右辺は,
で表される.(1)の右辺を近傍でテイラー展開すると,
は次のモーメントと呼ばれる.
選ぶ確率分布によってが無限大になることもあるが, そのような場合は除外して今後の計算をしていく(例えばローレンツ分布を選べばの偶数次のモーメントが無限大になる).
次に, (3)に自然対数を底とする対数をとって,
と書けるとする.このとき, を次のキュミュラント, (4)の展開をキュミュラント展開と呼ぶ.また,次のモーメントのように次のキュミュラントは以下のように表される.
ところで, (3)で対数をとったときに(4)の右辺にがどこにいったのかが疑問なると思うので, その部分を考慮しつつ, キュミュラント展開したときの最初の数項を書き下していく.
(3)を(4)の左辺にに代入すると,
となる. の近傍でのテイラー展開
を使う.
だと思って展開し, でまとめると,
(6)と(4)の各項を比較していくと, 1次から3次のキュミュラントは以下のようになる.
4次以降のキュミュラントは(6)の第4項以降を計算すれば得られる.
まとめ
結論としては, exp()の平均の対数はキュミュラント平均が分かれば計算できることが分かりました.統計力学では分配関数や大分配関数の対数から様々な物理量(ヘルムホルツの自由エネルギーなど)が導かれるので、この展開は必要だなと感じました(1変数では使い道は限られますが...).
多変数に拡張したキュミュラント展開の記事も今後書きたいと思います.
大阪大学基礎工学研究科 院試過去問 2019年物性物理科学I 解析力学
過去問の入手はこちらからどうぞ
大阪大学大学院基礎工学研究科物理系専攻・物性物理科学分野 過去の入試問題
http://www.gmp.mp.es.osaka-u.ac.jp/mpdept/gschoolexam/gexam.html
問1
ラグランジアンは運動エネルギーとポテンシャルを用いて,
と表される.
各質点の運動エネルギーは, となるので,
また, 各バネのポテンシャルは, , となるので,
それぞれをまとめるとラグランジアンは,
問2
をラグランジュの運動方程式に代入して,
問3
与えられた解を問2で示した方程式に代入する. そのまま代入するとcosの部分が冗長なので, とおいて計算する.
問2の第1式は,
第2式は,
(1)+(2)より,
(1)-(2)より,
問4
各質点の角振動数がの場合は2つの質点とも同じ向きに振動し, の場合は違い逆向きになる.
問5
平衡位置からの変位は, となる. また, であればと近似できる.
問1と同様にポテンシャルは,
また, 2つの円盤の回転エネルギーは慣性モーメント[tex: I = \frac{1}{2} M r2]を用いて,
よってラグランジアンは,
問6
問1と問5で求めたラグランジアンを比較する.
ここで, [tex: \dot{x_1} = \omega_3, \dot{x_2} = \omega_4, x_1 = \theta_1, x_2 = \theta_2, m = M r2 / 2, k_1 = r2 k_1, k_2 = r2 k_2]と置き直せば2つのラグランジアンは等価なので,
次回
次は電磁気の解答を載せようと思います.
ミスがあったら指摘して頂けると助かります。