Apr/11/2025 Updated by

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

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


[Up] Japanese English

前提条件


[メモ] これは、「大規模言語モデル入門」の8章のコードの8-4-simcse-faiss.ipynb を 動かすために試した。

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. faiss ライブラリをインストールする。
  24. 最初に、教科書と同じく cpu 版を用いることにしたら、エラーが発生した。
      pip install faiss-cpu
    
    ImportError: You must install Faiss to use FaissIndex. To do so you can run `conda install -c pytorch faiss-cpu` or `conda install -c pytorch faiss-gpu`. A community supported package is also available on pypi: `pip install faiss-cpu` or `pip install faiss-gpu`. Note that pip may not have the latest version of FAISS, and thus, some of the latest features and bug fixes may not be available.
    
    GPU版を使えばよいようだ。GPU版の faiss をインストールしたら、うまく最後まで動作した。
        pip install faiss-gpu
    

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

確認


8-4-simcse-faiss.ipynb が動作した。

8-3-simcse-training が動作するようにパッケージを追加インストールする


  pip install -U datasets
  pip install transformers
#  pip install scipy  <-- インストール済み
エラーがでる。
ImportError: Using the `Trainer` with `PyTorch` requires `accelerate>=0.26.0`: Please run `pip install transformers[torch]` or `pip install 'accelerate>={ACCELERATE_MIN_VERSION}'`
  pip install transformers[torch]
# 教師なしSimCSEの訓練を行う
unsup_trainer.train()


File /usr/local/lib/python3.8/dist-packages/transformers/trainer.py:976, in Trainer.get_train_dataloader(self)
    973     dataloader_params["worker_init_fn"] = seed_worker
    974     dataloader_params["prefetch_factor"] = self.args.dataloader_prefetch_factor
--> 976 return self.accelerator.prepare(DataLoader(train_dataset, **dataloader_params))

File /usr/local/lib/python3.8/dist-packages/torch/utils/data/dataloader.py:246, in DataLoader.__init__(self, dataset, batch_size, shuffle, sampler, batch_sampler, num_workers, collate_fn, pin_memory, drop_last, timeout, worker_init_fn, multiprocessing_context, generator, prefetch_factor, persistent_workers, pin_memory_device)
    243     raise ValueError('timeout option should be non-negative')
    245 if num_workers == 0 and prefetch_factor is not None:
--> 246     raise ValueError('prefetch_factor option could only be specified in multiprocessing.'
    247                      'let num_workers > 0 to enable multiprocessing, otherwise set prefetch_factor to None.')
    248 elif num_workers > 0 and prefetch_factor is None:
    249     prefetch_factor = 2

ValueError: prefetch_factor option could only be specified in multiprocessing.let num_workers > 0 to enable multiprocessing, otherwise set prefetch_factor to None.