子育てしながらエンジニアしたい

現在 7 歳 女の子の子育て中エンジニアによる、技術系 + 日常系ブログ。

Ubuntu 18.04 の Docker on GPU 環境をアップグレードする

以前、Ubuntu 18.04 に Docker on GPU 環境をインストールした記事を書きました。

edosha.hatenablog.jp

あれからだいぶ時がたち、最新の PyTorch on Docker などを動かすためには、NVIDIA Driver をアップグレードしないとダメになってきました。
そこで久々にアップグレードしようとしたのですが、いろいろはまったのでメモ的に残しておきます。

現在のドライバーのアンインストール

まず今のドライバーをアンインストールしないといけないんですね。
不要という記事も見かけるのですが、自分の環境では必要でした。

$ sudo apt remove --purge '^nvidia-.*'
$ sudo reboot

新しい NVIDIA Driver のインストール

これには 2 つ方法があるようです。
1. 公式サイトから run ファイルをダウンロードして sudo sh **.run とする
2. パッケージマネージャーからインストールする

1 をやろうとしたのですが、インストール中に「2 のほうがシステムと親和性があるかもよ」的なエラーメッセージが出たので、あらためて 2 でやることにしました。

以下の公式サイトの手順 (Ubuntu) に従いました。

docs.nvidia.com

$ sudo apt-get install linux-headers-$(uname -r)
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID | sed -e 's/\.//g')
$ wget https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/cuda-keyring_1.0-1_all.deb
$ sudo dpkg -i cuda-keyring_1.0-1_all.deb
$ sudo apt-get update
$ sudo apt-get -y install cuda-drivers

インストール中に、リブートして結果を確かめろよという文字が出たので、最後にリブート。

$ sudo reboot

リブート後に nvidia-smi でドライバーのバージョンを確認しました。

$ nvidia-smi
Wed Jun  8 13:59:03 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 515.48.07    Driver Version: 515.48.07    CUDA Version: 11.7     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  On   | 00000000:01:00.0 Off |                  N/A |
| 17%   35C    P8     1W / 250W |    143MiB / 11264MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1180      G   /usr/lib/xorg/Xorg                 57MiB |
|    0   N/A  N/A      1284      G   /usr/bin/gnome-shell               83MiB |
+-----------------------------------------------------------------------------+

NVIDIA Container Toolkit のインストール

最初に NVIDIA 関連のドライバーを全部消しているので、こちらも改めてインストールします。
やることは公式サイトの手順に従うだけです。

docs.nvidia.com

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
            sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
            sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
$ sudo apt-get update
$ sudo apt-get install -y nvidia-docker2

動作確認

最後に Docker をリスタートして、PyTorch の新しめのタグを起動してみました。

$ sudo systemctl restart docker
$ docker run --gpus all -it --rm nvcr.io/nvidia/pytorch:21.10-py3

無事に起動したので、PyTorch から GPU が見えているかを確かめました。

# python3
Python 3.8.12 | packaged by conda-forge | (default, Sep 29 2021, 19:52:28)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> print(torch.cuda.is_available())
True

無事、アップグレードできました。

WSL2 の Python スクリプトを Windows 側の VSCode で開発する

まえがき

前回の記事で、Windows 10 Home に WSL2 + Ubuntu 20.04 の環境を構築しました。

edosha.hatenablog.jp

もともとやりたかったのは、ここで Web サーバの開発をすることです。
サーバは Pipenv を使って Python で開発しています。
今回はそれを Windows 側の VSCode で開発する環境を整えてみます。

WSL2 Ubuntu 20.04 に Pyenv + Pipenv 環境を整える

Pyenv のインストール

WSL2 の Shell で以下を順番に入力します。

$ sudo apt install --no-install-recommends make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc
$ exec "$SHELL"

インストールができていることを確認するために、以下のコマンドを入れます。
バージョンが帰ってくれば OK です。

$ pyenv --version

Pipenv のインストール

まず最初に pip をインストールします。

sudo apt install python3-pip

次に pipenv をインストールします。

$ pip3 install --user pipenv
$ echo 'export PATH="$PATH:$HOME/.local/bin"' >> ~/.bashrc
$ exec "$SHELL"

インストールができていることを確認するために、以下のコマンドを入れます。
バージョンが帰ってくれば OK です。

$ pipenv --version

Pipenv で新しいプロジェクトを作成する

開発を行うディレクトリに移動したら、使いたい Python のバージョンを決めて、
以下のようにプロジェクトを作成します。

$ pipenv --python 3.7.11

このバージョンが Ubuntu 内になければ、Pyenv を使用してインストールするかと聞かれるので
y にすれば勝手にインストールしてくれます。

f:id:edosha:20211109150638p:plain
Pipenv プロジェクトの作成

VSCode でリモート開発のセットアップ

基本的にはここの手順に従います。

docs.microsoft.com

Remote Development Extension のインストール

VSCode の拡張パックで Remote Development をインストールします。

f:id:edosha:20211109151250p:plain
Remote Development

WSL2 のパッケージインストール

自分の環境では不要でしたが、参照サイトでは以下のコマンドを入れよと書いてありました。

$ sudo apt update
$ sudo apt install wget ca-certificates

開発するディレクトリを VSCode で開く

WSL 側のシェルで以下のコマンドを叩くと、最初に VSCode Server が自動的にインストールされます。
その後、このディレクトリを VSCode で開いてくれます。

$ code .

Python Extension を WSL 側にインストールする

Windows 側にはすでに Python Extension がインストールされています。
しかし WSL 側にもインストールする必要があります。
そのため Python Extension を探します。

f:id:edosha:20211109155639p:plain
Python Extension

Install in WSL をクリックしてインストールします。

Python Interpreter を選択する

Python Interpreter として、さきほど Pipenv でインストールした Python を選択します。
VSCode の左下をクリックするとリストが出てくるので、それらしきものを選択します。

f:id:edosha:20211109160130p:plain
Python Interpreter の選択

Windows 10 Home に WSL2 を入れる

まえがき

今開発しているのは Ubuntu をローカル Web サーバにした機械学習系のプロダクト。
クラウド Web サーバであれば AWS などを使うのでしょうが、ローカルネットワーク内でのみ使用する Web サーバなので、
サーバもローカルで外のネットワークに出ません。
つまりリモートアクセスができないのです。

昨今の流行りに乗って、週に何日かリモートワークをしていますが、開発サーバに外からアクセスできません。
またリモート時に持って帰るわけにもいきません。
仕方ないのでリモート用の Windows 10 Home に WSL2 を入れることにしました。

WSL2 のインストール

手順はこちらに書いてあるとおりです。

docs.microsoft.com

Windows のバージョンを確認する

Windows のバージョンが 2004 以上 (Build 19041 以上) であることを確認します。
Windows の設定 -> システム -> 詳細情報から確認できます。

f:id:edosha:20211109142729p:plain
Windows のバージョン確認

管理者で PowerShell を起動する

Windows キー + X を押した後 A キーをタイプすれば OK。

インストールするバージョンを選択する

WSL2 でインストールしたいバージョンがあるか確認します。
PowerShell で以下のコマンドを入力します。

wsl -l -o
f:id:edosha:20211109142959p:plain
インストールするバージョンの選択

所望のバージョンをインストールする

今回は Ubuntu 20.04 をインストールしたいので、PowerShell で以下のコマンドを入力します。

wsl --install -d Ubuntu-20.04

このあと再起動を求められることもあります。
その後ユーザ ID とパスワードを決めて、インストール完了です。
すごく簡単。

初期設定

初期設定の Best Practices は以下を見よとのことです。

docs.microsoft.com

とりあえずはパッケージのアップグレードだけしておきました。

$ sudo apt update && sudo apt upgrade

あと、WSL2 のファイルを Explorer で操作できるのは便利。

$ explorer.exe .

こうすると WSL2 のカレントディレクトリを Explorer で開けます。