DGX A100利用ガイド

ここでは,情報理工学部のGPGPU計算サーバNVIDIA の利用方法を簡単に説明する.

システム構成

CPU:
    AMD EPYC (Rome) 7742 2.25 GHz × 2 (物理コア128, 論理コア256)
メモリ:
    2 TiB
GPGPU:
    nVIDIA NVIDIA A100 80 GB × 8基
ストレージ:
    ホームディレクトリ領域 約 400 TiB

OS:
    DGX OS 6.0.11 (Ubuntu Server 22.04 LTS 相当)
開発ツール:
    GCC 11.3.0
    CUDA Toolkit 11.8
    cuDNN 8.6.0
    NCCL 2.15.5
    TensorFlow 2.12.0

システムへのアクセス

DGX A100システムへのログイン: ssh ユーザ名@dgx.cse.kyoto-su.ac.jp

但し,公開鍵認証の使用を必須としパスワード認証は許可されないので, 公開鍵の設置は以下記述のログインサーバを経由して行うこと. また同じくネットワーク帯域の都合上,DGX A100に対するSFTPファイル転送も不可能にされているので注意されたし.

尚,DGX A100はGPGPU計算サーバでありログインしたまま接続し続けるような利用を想定していない. プログラム起動に際して nohup 或いは tmux コマンドを使うなどして, 研究用プログラムを実行開始した後は特に必要ない限りログアウトしておくのが望ましい. これらコマンドの使用方法については各自Google検索し,コマンドの機能を十分理解した上で使用すること.

作業用ログインサーバについて

DGX A100は学内ネットワークへの接続回線速度があまり高速ではない. また,サーバ処理能力を出来るだけ研究向け計算処理に振り向けるべきなので,DGX A100上でプログラムを作成・修正するなど プログラム実行以外の作業を極力行わないようお願いする. プログラム修正などのファイル編集作業は以下記載のログインサーバへログインして行うこと.また,手元パソコンから プログラムファイルや実験用データなど各種ファイルのファイル転送もログインサーバに対して行い, 各自のホームディレクトリ配下に配置すること.

ログインサーバへのアクセス: ssh ユーザ名@login.cse.kyoto-su.ac.jp

このログインサーバはパスワード認証を受付けるので,公開鍵認証のための公開鍵設置はログインサーバに対して 行うこと.macOS端末からサーバへアクセスするための公開鍵設置については,以下の関連ドキュメントを参照のこと. 尚,一旦,公開鍵が設置されれば両サーバはホームディレクトリをNFS共有しているため, DGX A100に対して公開鍵認証でログインできるようになる.

また,プログラムの修正などテキストファイルの修正作業は emacs を使用する前提にて各種設定がチューニングされている.

ログインサーバに対してSFTPファイル転送する場合,macOS端末を使っているならGUIでドラッグ&ドロップで お手軽に操作でき,また,公開鍵認証もサポートするツール Fetch の使用をお勧めする. Fetchの使用方法は以下の関連ドキュメントを参照のこと.

関連ドキュメント

公開鍵認証を用いたSSH接続

macOS向けファイル転送ツールFetchの使用

サポート

システム管理者は基本的には一般ユーザをサポートしない.設定状況を自身で確認したり,Google検索,或いは, 指導教員の指示・サポートを受けること.何らかの問題で困った場合,まず第一に相談すべきは 各自の指導教員である.システム管理者は一般ユーザのよろず相談を受付けるほど暇ではない.

システム障害や設定上の不具合あれば具体的症状や対応策(パッチなど)と共にシステム管理者へ連絡頂ければ, そのうち対応するかも知れないが一切保証はしない.

注意事項

本システムでは一般利用者にはシステム管理者権限は付与されていない.つまり,ネット検索して良く見かけるコマンド

sudo xxxx xxxx

を共有サーバ環境でのリスクを何も考えずにコピペして実行するといったアホな特権操作は一切許可されない. もし,行おうとした場合,管理者に警告通知されるので状況次第では利用アカウント停止など措置を受けるから 十分注意のこと.

環境設定

本サーバはGPGPUコンピューティングに特化されており,基本的に管理者が調整した標準設定での利用が想定されている. むやみに標準の環境設定を変更・調整せず,そのまま利用することを強くお勧めする.

ファイルシステムの注意事項

ファイルシステムには以下の制限があるので注意されたい.

/tmp配下

tmpfsによる一時ファイルシステムにて構成されており,容量が8GBしかないのでサイズの大きなファイルを 不用意に配置しないこと.尚,放置されたファイルは10日後に自動削除される.

各自のホームディレクトリ配下

Oracle ZFS Storage Applianceをストレージサーバとした100G Ethernet経由のNFSボリュームであり, 総容量は約400TiB確保されているので,恐らく不足することはないだろう. また,CachefilesdによるNFSキャッシングサービスが稼働しており,研究・実験など各種プログラム類, 或いは,プログラムが参照するデータ類は全てホームディレクトリ配下に配置される事が想定されている. NFSキャッシュにより初めてのファイル参照には多少のオーバーヘッドがある可能性があるが, 2度目以降のファイルアクセスは十分に高速化される.

使用GPUの指定について

CUDA Toolkt,及び,それに依存するPython環境は,標準ではシステムに装備されている全てのGPUユニットと 全てのGPUメモリを専有しようとする.すなわち,これは一人の利用者がGPUを使うプログラムを実行すると他の誰も GPUプログラムを走らせることが出来ない(正確には,仮に走らせたとしても全く性能が出ない)事を意味する.

それでは利用者全員がお互い困ってしまうので,本システムではプログラム起動時に空きGPUを探して, そのうち一つをランダムに自動選択して動作するように調整してある.さらに,DGX A100はNUMAアーキテクチャの ハードウェア構成であるので,ハードウェア性能を最大限に引き出すには,各プログラムの実行において CPU affinityとGPU affinity,さらに,それらを考慮したメモリアロケーションを注意しなければならないが, エンドユーザにはいささかハードルが高いので,管理者側にて,これらを全て配慮した最適な状態でPythonプログラム (及びDockerコンテナ)が実行されるよう注意深く調整済みになっている.

技術的には複数GPUを活用したプログラム実行も可能だが,限られたGPUリソースを異なる研究室の異なるユーザ間で 上手く適切に配分することはほぼ不可能なので, 下手に空きGPUを狙ってプログラムを起動させるような小細工をせず, 素直に各自のプログラムを起動するようにすること.

尚,本システムに装備されたGPGPUは8基なので,システム上で同時稼働出来るGPU使用プログラムは8つに限定される. その状況の時,もし9番目のGPU使用プログラムを起動すると

CSE error: 空きGPUがありません!

というエラーメッセージが表示されるはずなので,その場合には他の既に動作中GPU使用プログラムが終了してGPUが 空くのを待つこと.

ちなみに空きGPUの定義は, GPU利用率0% かつ GPUメモリ利用率0% としている.

また,上記の自動割当調整は下記のRootless Docker利用時にも適用される.

プログラムの作成及び実行上の諸注意

多くの場合,以下の環境構築に関する記載に従って利用する場合が殆どと思われるが, 他のユーザに迷惑を掛けないよう協調的にシステム利用する ため,以下の各事項に全て配慮すること.

これらの配慮が適切にされず過剰なシステム負荷が発生して他ユーザの利用に影響が出るなどの事故が発生した場合, 問答無用で管理者権限にてDGXシステムに対して「出禁」とする場合もある(実際,既に起きた)ので十分注意されたい.

venvによるPython仮想化環境

GPGPUを活用したデータ処理を行う場合,開発言語としてPythonを使用することが多いが,その場合,数多くの追加 パッケージを必要とする.利用者それぞれが必要なパッケージを無計画にシステム標準として導入するとパッケージ 依存性が簡単に壊れてしまってPython環境が正常に動作しなくなる. Python (Python 3)に標準のvenvとpipを用いて各目的別にそれぞれ仮想環境を構築した上で利用すること.

仮想環境をvenvを用いて構成

以下の実行例では,ホームディレクトリ配下の my-env ディレクトリに仮想環境を構築している.

cd ~                            # ホームディレクトリへ移動
python3 -m venv my-env          # 仮想化環境をmy-env配下へ作成
source ./my-env/bin/activate    # 仮想化環境を有効化
pip install -U pip              # pipパッケージマネージャを更新

仮想環境を抜ける

deactivate

環境構築後の日常的使用手順

source ./my-env/bin/activate

(色々作業する)

(作業終了後)

deactivate

仮想環境の破棄

基本的には仮想環境を保持しているディレクトリを丸ごと削除すれば良い.

deactivate
cd ~
rm -rf ./my-env

TensorFlowの利用

TensorFlowパッケージについては,管理者にてDGX A100上で利用可能な状態に事前調整したパッケージを配置済みなので, こちらを利用されたい.

TensorFlow 2.12.0 パッケージをインストール

予め,TensorFlow向け仮想環境を一つ構成しておき,その仮想環境においてTensorFlow 2.12.0 パッケージをインストールする.

pip install /usr/local/share/tensorflow/tensorflow-2.12.0-cp310-cp310-linux_x86_64.whl

動作テスト

python3 -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"

実行例:(赤字箇所がキーボードからの入力)

(my-env) dgx(511)$ python3 -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')] <----- GPUと表示されればOK
(my-env) dgx(512)$

PyTorchの利用

深層学習系の研究ではPyTorchも良く使われている. 開発・更新が極めて早いので最新状況に関しては必ず公式サイトを確認すること.

PyTorch公式サイト: https://pytorch.org

PyTorch 安定版 2.0.1 のインストール

予め,PyTorch向け仮想環境を一つ構成しておき,その仮想環境においてPyTorchライブラリをインストールする.

pip install -U pip wheel
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

動作テストの実行例

実行例:(赤字箇所がキーボードからの入力)

(my-env) dgx(564)$ python3
Python 3.10.6 (main, May 29 2023, 11:10:38) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> x = torch.rand(5, 3)
>>> print(x)
tensor([[0.0204, 0.2672, 0.1272],    <---- 5x3乱数配列が表示されればPyTorchはOK
[0.7812, 0.6699, 0.4593],
[0.9090, 0.2972, 0.7484],
[0.4563, 0.7238, 0.0641],
[0.0864, 0.4014, 0.2553]])
>>> torch.cuda.is_available()
True    <----------------------------- True と表示されればGPUは認識されている
>>> ^D (Ctrl-DをタイプしてPythonインタープリタを抜ける)
(my-env) dgx(565)$

Hugging Face Transformersの利用

最先端の自然言語処理分野ではHugging Face社が開発・公開しているライブラリであるTransformersが使われる場合もある. Transformersもvenvによる仮想環境へインストールして使用できる.尚,Transformersも開発・更新が著しいので, 常に最新状況を確認すること.

Transformers公式サイト: https://huggingface.co/docs/transformers/

Transformersを使うための準備

Transformersを使用するには,予め,上記記載の手順にに従い,venvによる仮想環境を準備し,その仮想環境へ TransformersのバックエンドとなるTensorFlow,或いは,PyTorchの何れかを選択して, それを予めインストールしておく必要がある.

Transformersのインストール

TensorFlow,或いは,PyTorchをインストールした状態の仮想環境が構成出来たら,そこにTransformersをインストールする.

pip install transformers

動作テスト

python3 -c "from transformers import pipeline; print(pipeline('sentiment-analysis')('we love you'))"

実行例:(赤字箇所がキーボードからの入力)

(my-env) dgx(521)$ python3 -c "from transformers import pipeline; print(pipeline('sentiment-analysis')('we love you'))"
No model was supplied, defaulted to distilbert-base-uncased-finetuned-sst-2-english and revision af0f99b
(https://huggingface.co/distilbert-base-uncased-finetuned-sst-2-english).
Using a pipeline without specifying a model name and revision in production is not recommended.
Xformers is not installed correctly. If you want to use memory_efficient_attention to accelerate training
use the following command to install Xformers
pip install xformers.
[{'label': 'POSITIVE', 'score': 0.9998704195022583}] <----- このように出力されればTransformersは機能している
(my-env) dgx(522)$

Rootless Dockerの利用

最先端の研究領域では,CUDA ToolkitやPython環境のバージョン,さらにはOSディストリビューションの種類や バージョンに至るまで細かく合わせないとプログラムの環境が構築できない場合も珍しくない.

そのような極めて繊細なプログラム実行環境をポータブル化するのがDockerやPodmanといったコンテナ技術 であるが,本システムではDockerをRootlessモードで動作させるRootless Dockerを実験的にサポートしている.

尚,Rootless Dockerはroot権限を前提とする標準のDocker環境と比べれば,それなりに動作制限があり,動作しないコンテナも 有り得るが,その詳細についてはここでは言及しない.

また,今のところ,docker-composeについては使用を制限しているので注意のこと.

事前準備

Rootless Dockerを利用するには予め設定ツール cse-rootless-docker-setup.sh を実行しておく必要がある. 尚,この設定ツールの実行は一度だけ行えば良い.

実行例:(赤字箇所がキーボードからの入力)

dgx(501)$ cse-rootless-docker-setup.sh

京都産業大学・情報理工学部
Rootless Docker 設定ツール
                                       Version 20230719
                                       Written by Eitetsu Oomoto.


このツールは情報理工学部が運用する NVIDIA DGX A100 System 上で
Rootless Dockerに必要となるSystemd関連セットアップを行います.

このセットアップスクリプトでは以下の設定ファイルとディレクトリ
が作成されます.

    ~/.config/systemd/user
    ~/.config/systemd/user/docker.service

セットアップを実行しますか? (Y/n): Y

暫くお待ち下さい.

ファイルを抽出して配置しています.

0%               50%               100%
|-----------------------------------| Done!

セットアップが完了しました.

尚,RootlessモードでDockerコンテナを起動する前には
予め以下のコマンドを実行しておく必要があります.

    systemctl --user start docker

Enjoy!

Dockerdサービスをユーザモードで起動

Dockerコンテナを実行する際,必ず,systemdを通じてDockerdサービスをユーザモードにて手動起動しておく必要がある. このサービスはログアウトすると基本的に自動終了してしまうから,コンテナ実行前に予めサービス状態を確認して, 必要なら同様の操作で起動しておいてからコンテナ実行すること.

実行例:(赤字箇所がキーボードからの入力)

dgx(506)$ systemctl --user start docker.service    # Dockerdサービスを起動
dgx(507)$ systemctl --user status docker.service   # サービス起動を確認
● docker.service - Docker Application Container Engine (Rootless)
     Loaded: loaded (/home/oomoto/.config/systemd/user/docker.service; disabled; vendor >
     Active: active (running) since Thu 2023-07-20 19:24:51 JST; 4s ago <---- active の表示でOK
       Docs: https://docs.docker.com/go/rootless/
   Main PID: 42092 (rootlesskit)
      Tasks: 92
     Memory: 85.6M
        CPU: 460ms
     CGroup: /user.slice/user-2422.slice/user@2422.service/app.slice/docker.service
             ├─42092 rootlesskit --net=vpnkit --mtu=1500 --slirp4netns-sandbox=auto --sl>
             ├─42098 /proc/self/exe --net=vpnkit --mtu=1500 --slirp4netns-sandbox=auto ->
             ├─42108 vpnkit --ethernet /tmp/rootlesskit1609704861/vpnkit-ethernet.sock ->
             ├─42138 dockerd
             └─42174 containerd --config /run/user/2422/docker/containerd/containerd.tom>

 7月 20 19:24:51 dgx dockerd-rootless.sh[42138]: time="2023-07-20T19:24:51.050410010+09:>
 7月 20 19:24:51 dgx dockerd-rootless.sh[42138]: time="2023-07-20T19:24:51.050415060+09:>
 7月 20 19:24:51 dgx dockerd-rootless.sh[42138]: time="2023-07-20T19:24:51.050420370+09:>
 7月 20 19:24:51 dgx dockerd-rootless.sh[42138]: time="2023-07-20T19:24:51.050426321+09:>
 7月 20 19:24:51 dgx dockerd-rootless.sh[42138]: time="2023-07-20T19:24:51.050432573+09:>
 7月 20 19:24:51 dgx dockerd-rootless.sh[42138]: time="2023-07-20T19:24:51.050459825+09:>
 7月 20 19:24:51 dgx dockerd-rootless.sh[42138]: time="2023-07-20T19:24:51.050518035+09:>
 7月 20 19:24:51 dgx dockerd-rootless.sh[42138]: time="2023-07-20T19:24:51.062107026+09:>
 7月 20 19:24:51 dgx systemd[29736]: Started Docker Application Container Engine (Rootle>
 7月 20 19:24:51 dgx dockerd-rootless.sh[42138]: time="2023-07-20T19:24:51.067084897+09:>
dgx(508)$

DockerコンテナをRootlessモードで実行

Dockerdサービスがサービスが稼働していれば,普通にdocker runコマンドを実行してコンテナを実行できる. 尚,Docker操作の詳細についてはここでは言及しない.また,実験的運用のため docker-compose についてはサポートしない.

ここではサンプルとしてDockerプロジェクトが公開している hello-world コンテナを実行してみる.

注意: Google検索すると docker run コマンドのオプションにてGPU割り当て指定に関する オプション指定している事例が山ほど見つかるが,上記の記載通り,本システムではGPU割り当てを自動的に行う想定としているので, GPU割り当てオプション指定せずにコンテナ起動すること.

実行例:(赤字箇所がキーボードからの入力)

dgx(507)$ systemctl --user status docker.service        # コンテナ起動前にDockerdサービスの稼働を確認
● docker.service - Docker Application Container Engine (Rootless)
     Loaded: loaded (/home/oomoto/.config/systemd/user/docker.service; disabled; vendor >
     Active: active (running) since Thu 2023-07-20 19:24:51 JST; 4s ago
       Docs: https://docs.docker.com/go/rootless/
   Main PID: 42092 (rootlesskit)
      Tasks: 92
     Memory: 85.6M
        CPU: 460ms
     CGroup: /user.slice/user-2422.slice/user@2422.service/app.slice/docker.service
             ├─42092 rootlesskit --net=vpnkit --mtu=1500 --slirp4netns-sandbox=auto --sl>
             ├─42098 /proc/self/exe --net=vpnkit --mtu=1500 --slirp4netns-sandbox=auto ->
             ├─42108 vpnkit --ethernet /tmp/rootlesskit1609704861/vpnkit-ethernet.sock ->
             ├─42138 dockerd
             └─42174 containerd --config /run/user/2422/docker/containerd/containerd.tom>

 7月 20 19:24:51 dgx dockerd-rootless.sh[42138]: time="2023-07-20T19:24:51.050410010+09:>
 7月 20 19:24:51 dgx dockerd-rootless.sh[42138]: time="2023-07-20T19:24:51.050415060+09:>
 7月 20 19:24:51 dgx dockerd-rootless.sh[42138]: time="2023-07-20T19:24:51.050420370+09:>
 7月 20 19:24:51 dgx dockerd-rootless.sh[42138]: time="2023-07-20T19:24:51.050426321+09:>
 7月 20 19:24:51 dgx dockerd-rootless.sh[42138]: time="2023-07-20T19:24:51.050432573+09:>
 7月 20 19:24:51 dgx dockerd-rootless.sh[42138]: time="2023-07-20T19:24:51.050459825+09:>
 7月 20 19:24:51 dgx dockerd-rootless.sh[42138]: time="2023-07-20T19:24:51.050518035+09:>
 7月 20 19:24:51 dgx dockerd-rootless.sh[42138]: time="2023-07-20T19:24:51.062107026+09:>
 7月 20 19:24:51 dgx systemd[29736]: Started Docker Application Container Engine (Rootle>
 7月 20 19:24:51 dgx dockerd-rootless.sh[42138]: time="2023-07-20T19:24:51.067084897+09:>
dgx(508)$ docker run --rm hello-world        # hello-world コンテナをテスト実行

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

dgx(510)$ docker run ubuntu nvidia-smi    # コンテナからのGPU認識を確認
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
3153aa388d02: Pull complete 
Digest: sha256:0bced47fffa3361afa981854fcabcd4577cd43cebbb808cea2b1f33a3dd7f508
Status: Downloaded newer image for ubuntu:latest
Wed Jul 26 07:48:50 2023       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.125.06   Driver Version: 525.125.06   CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| 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 A100-SXM...  Off  | 00000000:0F:00.0 Off |                    0 |  # このようにGPUが一つだけ
| N/A   28C    P0    57W / 400W |      0MiB / 81920MiB |      0%      Default |  # 認識されていればOK
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
dgx(511)$

以上


元のページへ戻る