格安で機械学習環境(物理)を構築する方法 #2 OSインストール編

概要

前回作成した機械学習用サーバーに、

をインストールし、Dockerコンテナ上でnvidia-smiが動くまでを目指します。

世間にたくさんこういう情報は転がっているものの、やはり自分の環境で実行してみると様々なエラーに遭遇するものですので、自分もとりあえず遭遇したものは書き留めておこうという次第です。

Docker19.03よりネイティブでNvidia GPUへの対応が行われたようですが、今回はDeepLabCutというnvidia-docker2で動くソフトを使いたいので敢えて少し古めの構成にします。

CentOSのインストール

CentOSのホームページより、Older Versions→7のMirrors→好きなミラーからisoをダウンロード。 今回はMinimalイメージを選択しました。

Windows の方はRufusのようなライブUSB作成ツールを使って ダウンロードしたISOから起動ディスクを作成します。

インストール画面はGUIがあるので普通にインストールいただければ大丈夫かと思います。

下拵え

CentOS7のインストールが完了したら、いよいよNvidia Driverのインストール……の前に、ネットに繋ぐ準備。

久しぶりに実機のLinuxを作ったので、LANケーブルつないだだけでネットに繋がらないのに戸惑いましたが、こちらのページが非常に参考になりました。

# 次のコマンドでネットワークアダプタの名前を確認
[centos@]$ ip addr show
# 以下のコマンドではenp2s0のところを適宜自分のネットワークアダプタ名に書き換えてください
[centos@]$ sudo nmcli con add type ethernet con-name enp2s0 ifname enp2s0
[centos@]$ sudo nmcli con mod enp2s0 connection.autoconnect yes
[centos@]$ sudo nmcli con mod enp2s0 ipv4.method auto
[centos@]$ sudo nmcli con down enp2s0 
[centos@]$ sudo nmcli con up enp2s0 

これでDHCPで自動的にIPが振られ、ネットが繋がるようになります。

自分はここから先TeratermSSHつないでメインPCから操作します。同じようにやる方はもう一回ip addr showしてプライベートIP を確認しておきましょう。

そしてネットに繋がってyumが使えるようになるので、ここから必要になるパッケージ類のインストールをします。

# とりあえずアップデート
[centos@ip-xxx-xxx-xxx-xxx ~]$ sudo yum update
# cronよりwgetが好きなので入れときます
[centos@ip-xxx-xxx-xxx-xxx ~]$ sudo yum install wget
# nvidia-driver関連が手に入るレポジトリ
[centos@ip-xxx-xxx-xxx-xxx ~]$ sudo yum install epel-release
# これら3点は依存関係で勝手にインストールされることもあるが、入れとくのが安パイ
[centos@ip-xxx-xxx-xxx-xxx ~]$ sudo yum install kernel-devel kernel-headers gcc

ちなみに最後のKernel系が入らない場合、/etc/yum.confexclude=kernel*とか入ってるかもしれないです。自分はそれでハマったことがあります。

一時的にコメントアウトしてアップデート終わったらまた戻しておきましょう。勝手にkernel関連のアップデートが行われるのを防げるので、ポリシーに合わせて記述しときましょう。

とりあえずここまでで準備完了です!

CUDA10.0→nvidia-driverのインストール

※この辺の依存関係がはっきりしてないのですが、最近3回位1からCUDAのセットアップをしてきて最終的にこの順番で入れるとうまくいく感じです。

CUDA10.0いれた状態でCUDA-driverとnvidia-driverは入っているのですが、どうしてもこの手順を踏まないと依存関係の解決がうまく行かないのか、nvidia-smiが起動しないというトラブルに見舞われているので、同じものを何度も入れ直したりアップデートしたりするのは正直気持ちが悪いのですが暫定的に書いておきます。

いつかすんなり行く方法が見つかればまた書き直したいと思います※

参考文献は以下の通り。

CentOS7にDocker CE / nvidia-dockerのインストール | CVTECH.cc

Linux インスタンスへの NVIDIA ドライバーのインストール - Amazon Elastic Compute Cloud

# Linuxで標準に入ってしまっているnouveauというドライバーを無効化するための設定
[centos@ip-xxx-xxx-xxx-xxx ~]$ echo 'blacklist nouveau' >> /etc/modprobe.d/modprobe.conf
[centos@ip-xxx-xxx-xxx-xxx ~]$ echo 'blacklist nouveau' >> /etc/modprobe.d/nouveau_blacklist.conf
# 一回ここで再起動
[centos@ip-xxx-xxx-xxx-xxx ~]$ reboot now

# まずCUDAのインストール。
# インストールするrpmは[https://developer.nvidia.com/cuda-toolkit-archive]から探す。
[centos@ip-xxx-xxx-xxx-xxx ~]$ wget https://developer.nvidia.com/compute/cuda/10.0/Prod/local_installers/cuda-repo-rhel7-10-0-local-10.0.130-410.48-1.0-1.x86_64
[centos@ip-xxx-xxx-xxx-xxx ~]$ ls
cuda-repo-rhel7-10-0-local-10.0.130-410.48-1.0-1.x86_64
[centos@ip-xxx-xxx-xxx-xxx ~]$ sudo rpm -ivh cuda-repo-rhel7-10-0-local-10.0.130-410..48-1.0-1.x86_64.rpm --nosignature
[centos@ip-xxx-xxx-xxx-xxx ~]$ sudo yum clean all
[centos@ip-xxx-xxx-xxx-xxx ~]$ sudo yum install cuda-10-0

# 次にNvidia Driverのインストール。
# [https://www.nvidia.com/Download/index.aspx?lang=en-us]ここから探します。下のURLはTesla用。
[centos@ip-xxx-xxx-xxx-xxx ~]$ wget  http://us.download.nvidia.com/tesla/410.129/NVIDIA-Linux-x86_64-410.129-diagnostic.run
[centos@ip-xxx-xxx-xxx-xxx ~]$ ls
cuda-repo-rhel7-10-0-local-10.0.130-410.48-1.0-1.x86_64.rpm
nvidia-diag-driver-local-repo-rhel7-410.129-1.0-1.x86_64.rpm
NVIDIA-Linux-x86_64-410.129-diagnostic.run
# ”すでにインストールしてるけど続ける?”とか出てくるけどYESで。DKMSがうんたらはYES、32bit用のインストールはNOで。
[centos@ip-xxx-xxx-xxx-xxx ~]$ sudo sh NVIDIA-Linux-x86_64-410.129-diagnostic.run ---no-drm

ここまで終わって再起動すれば、nvidia-smiが効くようになっているはず!おつかれさまでした!

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.129      Driver Version: 410.129      CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla K40m          Off  | 00000000:01:00.0 Off |                    0 |
| N/A   32C    P0    32W / 235W |      0MiB / 11441MiB |     0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

SELinuxの無効化