Apr/11/2025 Updated by

「大規模言語モデル入門」

のコードが動く Docker コンテナ


[Up] Japanese English

前提条件



1. Docker Container を用意する


1.1. 作成すべき python 仮想環境


1.2. nVidia GPU (CUDA) に対応した Docker Image を探す

NVIDIA Optimized Frameworks: PyTorch Release Notes
https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch/tags?version=25.09-py3
nVidia のサイトで pytorch に対応している container を探す。 本の出版が 2023年7月なので、その少し前にリリースされたバージョンを使ってみる。
PyTorch Release 23.02

Ubuntu 20.04 including Python 3.8
NVIDIA CUDA® 12.0.1
NVIDIA cuBLAS from CUDA 12.0.1
NVIDIA cuDNN 8.7.0.84
NVIDIA NCCL 2.16.5 (optimized for NVIDIA NVLink®)
NVIDIA RAPIDS™ 22.12.0
Apex
rdma-core 36.0
NVIDIA HPC-X 2.13
OpenMPI 4.1.4+
GDRCopy 2.3
TensorBoard 2.9.0
Nsight Compute 2022.4.1.6
Nsight Systems 2022.5.1
NVIDIA TensorRT™ 8.5.3
Torch-TensorRT 1.4.0dev0
NVIDIA DALI® 1.22.0
MAGMA 2.6.2
JupyterLab 2.3.2 including Jupyter-TensorBoard
Container   Ubuntu   CUDA      PyTorch          TensorRT
version              Toolkit
---------  --------  -------  ---------------   --------
23.02      20.04     12.0.1   1.14.0a0+44dac51  8.5.3

1.3. Docker Container を作成する

  1. 使用したい Docker Image が見つかったら、 以下のコマンドでダウンロードして Docker Container を作成し、実行できる。
  2. (例) 緑色の文字部分は環境に合わせて変更すること
    docker run --gpus all -it --rm -v local_dir:container_dir nvcr.io/nvidia/pytorch:23.07-py3
    
  3. 以下の条件でコンテナを作成する。
  4. 割当コンテナ名ポート1
    (22へ転送)
    ポート2
    (8888へ転送)
    /root/doc
    マウント先
    Docker Image
    -llm0170718081 /home/docker/llm01 nvcr.io/nvidia/pytorch:23.02-py3
  5. Docker Host である Windows 上の Ubuntu (WSL2) の対話環境の中で以下のコマンドを実行する。
  6. docker run --name llm01 --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 --gpus all \
         -p 7071:22 -p 8081:8888 \
         -v /home/docker/llm01:/root/doc \
         -it nvcr.io/nvidia/pytorch:23.02-py3
    

1.4. Docker Container の環境を整える (ssh)

  1. Docker Guest の対話環境にアクセスする。
  2. docker ゲストOS で GPU が見えているかを確認する。
  3. root@99f0fbb579b5:/workspace# nvidia-smi
    Sun Oct  5 08:34:43 2025
    +-----------------------------------------------------------------------------------------+
    | NVIDIA-SMI 580.82.10              Driver Version: 581.29         CUDA Version: 13.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 GeForce RTX 3070 ...    On  |   00000000:01:00.0 Off |                  N/A |
    | N/A   48C    P8             23W /  125W |       0MiB /   8192MiB |      0%      Default |
    |                                         |                        |                  N/A |
    +-----------------------------------------+------------------------+----------------------+
    
    +-----------------------------------------------------------------------------------------+
    | Processes:                                                                              |
    |  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
    |        ID   ID                                                               Usage      |
    |=========================================================================================|
    |  No running processes found                                                             |
    +-----------------------------------------------------------------------------------------+
    root@99f0fbb579b5:/workspace# nvcc --version
    nvcc: NVIDIA (R) Cuda compiler driver
    Copyright (c) 2005-2023 NVIDIA Corporation
    Built on Fri_Jan__6_16:45:21_PST_2023
    Cuda compilation tools, release 12.0, V12.0.140
    Build cuda_12.0.r12.0/compiler.32267302_0
    
  4. python の状況を調べる
  5. root@99f0fbb579b5:/workspace# python
    Python 3.8.10 (default, Nov 14 2022, 12:59:47)
    [GCC 9.4.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> exit()
    
  6. openssh の環境を整える。パスワードの部分は推測されにくい文字列に変更すること。
  7. apt-get update
    apt-get upgrade -y
    apt-get install -y openssh-server
    echo 'root:パスワード' | chpasswd
    sed -i "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/" /etc/ssh/sshd_config
    service ssh start
    
  8. これで、ポート番号を指定して外からdocker guest に ssh アクセスできるようになる。 IP アドレスは docker host のもの。
  9. ssh -p 7076 root@133.99.41.195
    
  10. 後で cmake をコンパイルするときに必要になるので openssh 開発用ライブラリもインストールしておく。
  11. apt-get install libssl-dev
    apt-get install -y openssh    ← openssh パッケージのインストールがなぜか失敗する。
    

1.5. Docker Container の環境を整える (HuggingFaceのdatabase, Faiss)

  1. 「大規模言語モデル」の第8章のサンプルコードを送り込む。rsyncコマンドを使っているが、通信プロトコルは ssh で、docker guest への ssh ポート番号である 7071 を指定する。
  2. rsync -avr -e "ssh -p 7076" sample root@133.99.41.195:/root/doc
    
  3. pytorch は 1.14 がインストール済み。
  4. >>> import torch
    >>> print(torch.__version__)
    1.14.0a0+44dac51
    >>> import torchvision
    >>> print(torchvision.__version__)
    0.15.0a0
    >>> exit()
    
  5. HuggingFace の datasets はデフォルトではインストールされていないので、インストールする。
  6. # pip install datasets
    ...
    >>> import datasets
    >>> print(datasets.__version__)
    3.1.0
    
    HuggingFace からのデータ読み込みでエラーがでない。
    from datasets import load_dataset
    paragraph_dataset = load_dataset("llm-book/jawiki-paragraphs", split="train")
    
  7. transformers はインストールされていないので、自分でインストールする。
  8. # pip install transformers     # ← こちらを選択した
    または
    # pip install -U transformers   # 最新版を使う場合
    
    # python
    import transformers
    print(transformers.__version__)
    4.46.3
    
  9. Hugging Face の日本語 BERT 系モデルは形態素解析エンジン MeCab 用の Python ラッパー fugashi に依存している。
  10. >>> from transformers import AutoModel, AutoTokenizer
    
    >>> model_path = "outputs_unsup_simcse/encoder"
    >>>tokenizer = AutoTokenizer.from_pretrained(model_path)
    ...
    ModuleNotFoundError: No module named 'fugashi'
    
    解決策
    # pip install fugashi
    # pip install ipadic unidic-lite    # ipadic: 辞書データ, unidic-lite: 軽量版辞書
    
    from transformers import AutoTokenizer
    
    model_id = "llm-book/bert-base-japanese-v3-unsup-simcse-jawiki"
    tokenizer = AutoTokenizer.from_pretrained(model_id)
    encoder = AutoModel.from_pretrained(model_name)
    
    encoder を生成するところでエラーが起きるが、torchライブラリがないかららしい。 torch, torchvision はインストール済み。torchaudio がないのが原因か?
    >>> import torch
    >>> print(torch.__version__)
    2.8.0+cu128
    >>> import torchvision
    >>> print(torchvision.__version__)
    0.16.0a0
    >>> import torchaudio
    エラー
    
    pip install torchaudio
    
    # python
    >>> import torchaudio
    >>> print(torchaudio.__version__)
    2.8.0+cu128
    

    def func(a: list[str]) 形式は python 3.9+ から。3.8だとエラーになる。 ただ、これ以降の container は pytorch が1.14 から2にバージョンアップするので、 エラーが起きると思われる。 関数の「引数の型」と「返り値の型」の記述を除去することで対応してみる。

  11. サンプルコードでは、Colab にファイルをアップロードしているが、その機能を代替するために ipywidgets パッケージが必要。
  12. pip install ipywidgets
    

jupyter notebookを起動する。

jupyter notebook --allow-root --ip=0.0.0.0 --no-browser
他のマシンからアクセスするには "--ip=0.0.0.0" の指定が必要であることに注意。
(動作中の jupyter notebook の token を知る)
jupyter notebook list

外部からアクセスする

http://133.99.41.195:8086/?token=a62e....e0ab