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.07

Ubuntu 22.04 including Python 3.10
NVIDIA CUDA® 12.1.1
NVIDIA cuBLAS 12.1.3.1
NVIDIA cuDNN 8.9.3
NVIDIA NCCL 2.18.3
NVIDIA RAPIDS™ 23.06
Apex
rdma-core 39.0
NVIDIA HPC-X 2.15
OpenMPI 4.1.4+
GDRCopy 2.3
TensorBoard 2.9.0
Nsight Compute 2023.1.1.4
Nsight Systems 2023.2.3.1001
NVIDIA TensorRT™ 8.6.1.6
Torch-TensorRT 1.5.0.dev0
NVIDIA DALI® 1.27.0
MAGMA 2.6.2
JupyterLab 2.3.2 including Jupyter-TensorBoard
TransformerEngine 0.10.0+96ed6fc
PyTorch quantization wheel 2.1.2
Container   Ubuntu   CUDA      PyTorch          TensorRT
version              Toolkit
---------  --------  -------  ---------------  ----------
23.07      22.04     12.1.1   2.1.0a0+b5021ba  8.6.1.6

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.07-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.07-py3
    

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

  1. Docker Guest の対話環境にアクセスする。
  2. docker ゲストOS で GPU が見えているかを確認する。
  3. root@ea8c1fabfe70:/workspace# nvidia-smi
    Sun Apr 13 14:25:41 2025
    +-----------------------------------------------------------------------------------------+
    | NVIDIA-SMI 565.72                 Driver Version: 566.14         CUDA Version: 12.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 RTX 3070 ...    On  |   00000000:01:00.0 Off |                  N/A |
    | N/A   73C    P0            111W /  125W |    7069MiB /   8192MiB |     78%      Default |
    |                                         |                        |                  N/A |
    +-----------------------------------------+------------------------+----------------------+
    
    +-----------------------------------------------------------------------------------------+
    | Processes:                                                                              |
    |  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
    |        ID   ID                                                               Usage      |
    |=========================================================================================|
    |    0   N/A  N/A     14596      C   /python3.6                                  N/A      |
    +-----------------------------------------------------------------------------------------+
    root@ea8c1fabfe70:/workspace# nvcc --version
    nvcc: NVIDIA (R) Cuda compiler driver
    Copyright (c) 2005-2023 NVIDIA Corporation
    Built on Tue_Feb__7_19:32:13_PST_2023
    Cuda compilation tools, release 12.1, V12.1.66
    Build cuda_12.1.r12.1/compiler.32415258_0
    
  4. python の状況を調べる
  5. root@ea8c1fabfe70:~# 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.
    >>> import tensorflow as tf
    2025-04-13 14:30:13.535393: I tensorflow/stream_executor/platform/default/dso_loader.cc:50] Successfully opened dynamic library libcudart.so.12
    WARNING:tensorflow:Deprecation warnings have been disabled. Set TF_ENABLE_DEPRECATION_WARNINGS=1 to re-enable them.
    >>> print(tf.__version__)
    1.15.5
    >>> 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. 最初からインストールされているパッケージのバージョンは 3.10.x のようだ。Faiss を使うのに問題ないバージョンのはず。
  4. root@ba98c4144c3c:/workspace# python
    Python 3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    
  5. pytorch は 2.1 がインストール済み。
  6. >>> import torch
    >>> print(torch.__version__)
    2.1.0a0+b5021ba
    
  7. numpy は 1.22.2 であった。
  8. >>> import numpy as np
    >>> print(np.__version__)
    1.22.2
    
  9. matplotlib は3.7.0であった。
  10. >>> import matplotlib
    >>> print(matplotlib.__version__)
    3.7.2
    
  11. pandas は 1.5.2 であった。
  12. >>> import pandas as pd
    >>> print(pd.__version__)
    1.5.2
    
  13. PIL (Pillow) は 9.2.0 であった。
  14. >>> import PIL
    >>> print(PIL.__version__)
    9.2.0
    
  15. h5py はデフォルトではインストールされていない。
  16. >>> import h5py
    Traceback (most recent call last):
      File "", line 1, in 
    ModuleNotFoundError: No module named 'h5py'
    # pip install h5py
    ...
    # python
    >>> import h5py
    >>> print(h5py.__version__)
    3.14.0
    
  17. HuggingFace の datasets はデフォルトではインストールされていないので、インストールする。
  18. # pip install datasets
    ...
    >>> import datasets
    >>> print(datasets.__version__)
    4.1.1
    
    HuggingFace からのデータ読み込みでエラーとなる。
    >>> import datasets
    >>> print(datasets.__version__)
    4.1.1
    >>> from datasets import load_dataset
    >>> paragraph_dataset = load_dataset("llm-book/jawiki-paragraphs", split="train")
    README.md: 1.22kB [00:00, 5.89MB/s]
    jawiki-paragraphs.py: 3.22kB [00:00, 6.38MB/s]
    Traceback (most recent call last):
      File "", line 1, in 
      ...
      File "/usr/local/lib/python3.10/dist-packages/datasets/load.py", line 989, in dataset_module_factory
        raise RuntimeError(f"Dataset scripts are no longer supported, but found {filename}")
    RuntimeError: Dataset scripts are no longer supported, but found jawiki-paragraphs.py
    
    これは、datasets がv4.0.0 以降で、「データセットスクリプト(.py)による読み込みが廃止」されたためである。 llm-book/jawiki-paragraphs には jawiki-paragraphs.py があり、それを検出して落ちている。 対処は主に2通りある。
    1. Parquet 版を読む(推奨)
    2. datasets ライブラリをダウングレードする
    このデータセットには自動変換の Parquet ブランチ が用意されているので、 Parquet 版を読む方法で、エラーを回避する。
    from datasets import load_dataset
    
    ds = load_dataset(
        "llm-book/jawiki-paragraphs",
        revision="refs/convert/parquet",   # ← これがポイント
        split="train",
    )
    
  19. transformers はインストールされていないので、自分でインストールする。
  20. # pip install transformers
    または
    # pip install -U transformers   # 最新版を使う場合
    
    # python
    >>> print(transformers.__version__)
    4.57.0
    
  21. Hugging Face の日本語 BERT 系モデルは形態素解析エンジン MeCab 用の Python ラッパー fugashi に依存している。
  22. >>> 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
    
  23. サンプルコードでは、Colab にファイルをアップロードしているが、その機能を代替するために ipywidgets パッケージが必要。
  24. 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