【2023年版】Ubuntu Server 23.04で機械学習の勉強環境を構築する方法
はじめに
Ubuntu Server 23.04 に機械学習の環境を構築した。その方法を共有する。
設定方針を以下に示す。
- 基本的に Nvidia や Tensorflow が推奨している方法を用いる。
- X11 はインストールするが、desktop 環境はインストールしない。
- nvidia-driver だけ apt で管理する。
- nvidia-driver 以外は Anaconda で管理する。
私の PC のスペック[1]
- i7 13700K
- 3090 24GB
- DDR5 128GB
OS まわり
OS のインストール
Ubuntu Server 23.04 を以下からダウンロードする。
(新しい Linux カーネルを利用したいため、22.04 ではなく 23.04 を利用。)
必要なパッケージをインストール
開発に必要なパッケージをインストール。
sudo apt install build-essential
nvidia-settings を使うのに必要なので、X11 をインストール。
sudo apt install xserver-xorg
起動の高速化
Ubuntu は起動時に全てのネットワークデバイスが有効になるまで待ち時間がある。使わないネットワークデバイスを起動時に無視する設定を行うことで起動を高速化ができる。
networkctl # 使ってないネットワークデバイスを確認
sudo vim /usr/lib/systemd/system/systemd-networkd-wait-online.service # 設定を追加
自分の環境では以下のように--ignore=eno1
を追加した。
[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-networkd-wait-online --ignore=eno1
RemainAfterExit=yes
CPU 温度と FAN 回転数の取得
lm-sensors
で CPU 温度と FAN 回転数を取得できるようにする。
$ sudo apt install lm-sensors
以下のコマンドで自分のパソコンのカーネルモジュールを取得する。
$ sudo sensors-detect
基本的に全てエンターで大丈夫。最後/etc/modules
に追記の部分だけ Yes とする。以下コマンドで、カーネルモジュールが追加されていることを確認する。
$ cat /etc/modules
自分の環境では、以下のモジュールが追加されていた。
# Chip drivers
coretemp
nct6775
以下コマンドでカーネルモジュールを読み込む。
$ sudo /etc/init.d/kmod start
以下コマンドでモジュールを確認する。
$ lsmod | grep coretemp
$ lsmod | grep nct6775
以下コマンドで温度が確認できる。
$ sensors
nvidia-driver まわり
インストール
Nvidia の人の記事[1:1]を参考にインストールする。
まず、以下ページを開き Ubuntu 22.04 を選択する。
すると以下のコードが出てくる。
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.1.1/local_installers/cuda-repo-ubuntu2204-12-1-local_12.1.1-530.30.02-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2204-12-1-local_12.1.1-530.30.02-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2204-12-1-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda
最後の cuda の部分を cuda-drivers にすると、nvidia-drivers だけがインストールされる。インストール後は再起動。
(このやり方だとnouveau
の無効化や Xserver の無効化などをしなくていいらしい。)
ファンの設定
nividia-settings でファンの速度を設定できる。
Mac であれば Xquartz をインストールして起動して以下コマンドで ssh すれば X11 フォワーディングが使え、GUI でファンの速度を設定可能である。(nvidia-settings は root ユーザーでなければ正常に動作しないため root でログインしている。)
ssh -X root@<Server IP>
以下コマンドで nvidia-settings を起動する。
nvidia-settings
Enable GPU Fan Settings を有効化するとファンが動作し始める。
動作しない時
上記の設定をしてもファンが動作しないことがある。その時は以下の設定をすることで動作する場合がある。
-
/etc/X11/Xwrapper.config
のallowed_users=console
前に以下を追加する。
allowed_users=anybody
needs_root_rights=yes
allowed_users=console
- nvidia-xconfig の設定を行う。
nvidia-xconfig --allow-empty-initial-configuration --cool-bits=31 --enable-all-gpus
- ファンの速度を固定する。
nvidia-settings -a "[gpu:0]/GPUFanControlState=1" -a "[fan:0]/GPUTargetFanSpeed=80" -a "[fan:1]/GPUTargetFanSpeed=80"
Anaconda まわり
インストール
以下から Anaconda のインストールスクリプトを探す。
URL をコピーしてサーバーでダウンロードして実行、規約読んで同意する。
wget https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh
bash Anaconda3-2023.03-1-Linux-x86_64.sh
環境の作成
tensorflow 用の環境を作成。
conda create -n tfenv anaconda
環境に入る。
conda activate tfenv
以下を参考に tensorflow をインストールする。
conda install -c conda-forge cudatoolkit=11.8.0
python3 -m pip install nvidia-cudnn-cu11==8.6.0.163 tensorflow==2.12.*
mkdir -p $CONDA_PREFIX/etc/conda/activate.d
echo 'CUDNN_PATH=$(dirname $(python -c "import nvidia.cudnn;print(nvidia.cudnn.__file__)"))' >> $CONDA_PREFIX/etc/conda/activate.d/env_vars.sh
echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CONDA_PREFIX/lib/:$CUDNN_PATH/lib' >> $CONDA_PREFIX/etc/conda/activate.d/env_vars.sh
source $CONDA_PREFIX/etc/conda/activate.d/env_vars.sh
# Verify install:
python3 -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
tfenv 環境内で実行することにより cuda も tfenv で閉じた環境にインストールされる。そのため torchenv を作成したかったら別の cuda バージョンを指定してインストールできる。
mnist モデルの学習
以下のコードを動かして動作を確認。
import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten
# load data of mnist
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train = tf.keras.utils.normalize(x_train, axis=1)
x_test = tf.keras.utils.normalize(x_test, axis=1)
# build model
model = tf.keras.models.Sequential([
Flatten(input_shape=(28, 28)),
Dense(1024, activation=tf.nn.relu),
Dense(10, activation=tf.nn.softmax)
])
# compile model
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# train model
model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test))
私の環境では、以上のモデルを学習したら以下のエラーが出た。
InternalError: libdevice not found at ./libdevice.10.bc [Op:__some_op]
エラーの解決
以下に、Ubuntu 22.04 ではInternalError: libdevice not found at ./libdevice.10.bc [Op:__some_op]
のエラーが出る場合があると記載されており、その解決法も記載されていた。
以下のスクリプトを実行する。
# Install NVCC
conda install -c nvidia cuda-nvcc=11.3.58
# Configure the XLA cuda directory
mkdir -p $CONDA_PREFIX/etc/conda/activate.d
printf 'export XLA_FLAGS=--xla_gpu_cuda_data_dir=$CONDA_PREFIX/lib/\n' >> $CONDA_PREFIX/etc/conda/activate.d/env_vars.sh
source $CONDA_PREFIX/etc/conda/activate.d/env_vars.sh
# Copy libdevice file to the required path
mkdir -p $CONDA_PREFIX/lib/nvvm/libdevice
cp $CONDA_PREFIX/lib/libdevice.10.bc $CONDA_PREFIX/lib/nvvm/libdevice/
これで MNIST のモデルが学習できるようになった。
おわりに
数年前にも tensorflow の環境構築をやった時もかなり面倒くさかった記憶がある。数年経って改善されたかと思っていたが、今回もかなり苦戦した。特に GPU ファンが正常に回らなかったり、conda の tensorflow パッケージが動作しなかったりする部分が苦戦した。ちなみに GPU ファンを温度によって自動で調整する方法はまだ分かっていない。A100 みたいな機械学習用の GPU であればこの辺りの設定で苦労することはないのかな。
関連記事
Discussion