---
# System prepended metadata

title: Megatron-DeepSpeed 環境構築方法
tags: [deepspeed, llm, python]

---

https://zenn.dev/turing_motors/articles/04c1328bf6095a
こちらの方により詳しい説明があります。

## セットアップ方法

動作確認をしているPython Versionは3.10.10です。
3.10系であれば問題なく動作すると思います。
(CUDA11.6環境ではPython3.11では上手くpip installできないことが確認されています。)
以下では、Python3.10.10を使用します。
(pyenv等でpython versionを環境ごとに切り替えることをオススメします)

1. [microsoft/magatron-deepspeed](https://github.com/microsoft/Megatron-DeepSpeed) よりgit cloneしてきます
2. CUDA環境を用意してください。
    [Lambdalab](https://cloud.lambdalabs.com/instances)の場合はデフォルトで入っています。module loadする必要はありません。

    計算資源の環境によっては、moduleをloadする必要があります。
    Slurm環境などの場合は、テキトウなリソースを確保してください。
    (以下、横田研lab serverの例)
    ```bash
    module load cuda/11.6
    module load cudnn/cuda-11.6/8.4.1
    module load nccl/cuda-11.6/2.11.4
    ```
    (注意: module loadした場合は、loadできているか、module listで確認しましょう)
3. `nvidia-smi`により環境を確認してください。以下ではCUDA11.7を前提にしています。Cloud環境などで、CUDA versionの変更が不可能な場合は、pip install時にrequirements.txtを工夫してください。以下ではCUDA11.7以外での動作は保証しません。
5. pip install をします。
    `cd Megatron-DeepSpeed`をしてから仮想環境を作りましょう。
    pyenv virtualenv, poetryによる仮想環境の構築は非推奨です。
    おそらく`megatron/data/helper`でimportエラーが発生します。
    そのため、以下では`python -m venv .env`などで仮想環境を構築します。
    ```bash
    > python --version
    3.10.10
    > python -m venv .env
    > source .env/bin/activate
    > which python
    /path/Megatron-DeepSpeed/.env/bin/python
    ```
    
    次に仮想環境で`pip install -r requirements.txt`をします。
    その後`pip install deepspeed`も行ってください(requirements.txtに書き足してもかまいません)
    
    (2023/6/28現在、linux環境で`pip install torch`をするとCUDA11.7対応のPyTorchがinstallされます。お使いのCUDA versionが異なる場合は、[ここ](https://download.pytorch.org/whl/torch/)から環境にあったpytorchを探し出しましょう。探せたら、以下のような形でrequirements.txtを変更します)
    
    CUDA11.6の場合の変更例
    ```txt
    pybind11
    # for install pytorch version cu116
    --find-links https://download.pytorch.org/whl/torch_stable.html
    torch==1.13.1+cu116
    torchvision==0.14.1+cu116
    six
    regex
    numpy
    ```
    
5. 次にNIVIDA:apexをinstallします。`pip install`では動かないので、sourceからbuildしてください。
    install方法がときどき変更になるので、[apex#from-source](https://github.com/NVIDIA/apex#from-source)を自分で見て確かめてください。以下に、6/23時点で上手くいった手順を記します。
    
    以下のコマンドを`Megatron-DeepSpeed/`にて行います。
    pipのversionが23.1以降であることを前提にしています。
    `pip install --upgrade pip`などでupdateするなりして、23.1以降にしてください
    
    次に以下のコマンドをCUDA環境で行います。Slurm環境などの場合は、テキトウなリソースを確保してmodule load cuda/11.7 をしてください。(手順通りしている場合は、すでにload済みなはずです)
    
    ```bash
    git clone https://github.com/NVIDIA/apex
    cd apex
    pip install -v --disable-pip-version-check --no-cache-dir --no-build-isolation --config-settings "--build-option=--cpp_ext" --config-settings "--build-option=--cuda_ext" ./
    ```
    
    C++のwarningがたくさん発生します。また環境によっては10分以上installに時間を要します。気長に待ちましょう。
    ```
    Successfully built apex
    Installing collected packages: apex
    Successfully installed apex-0.1
    ```
    と出れば成功です。(もしエラーが発生した場合は、おそらくCUDA環境が正しくloadできていません。)


## 動作チェック

仮のJobを流して動作チェックをします

1. データダウンロード
    ```bash
    cd dataset
    bash download_books.sh
    bash download_vocab.sh
    ```
    
2. 1 node 1 GPUで実験

    `examples/pretrain.sh`を変更して、jobを投げる。
    手順通りしている場合は
    
    `Megatron-Deepspeed/`にて `mkdir -p checkpoints/345m-1gpu`とした後
    
    ```bash
    #! /bin/bash

    # Runs the "345M" parameter model

    RANK=0
    WORLD_SIZE=1

    DATA_PATH=dataset/BookCorpusDataset_text_document
    CHECKPOINT_PATH=checkpoints/345m-1gpu


    python pretrain_gpt.py \
       --num-layers 24 \
       --hidden-size 1024 \
       --num-attention-heads 16 \
       --micro-batch-size 4 \
       --global-batch-size 8 \
       --seq-length 1024 \
       --max-position-embeddings 1024 \
       --train-iters 500000 \
       --lr-decay-iters 320000 \
       --save $CHECKPOINT_PATH \
       --load $CHECKPOINT_PATH \
       --data-path $DATA_PATH \
       --vocab-file dataset/gpt2-vocab.json \
       --merge-file dataset/gpt2-merges.txt \
       --data-impl mmap \
       --split 949,50,1 \
       --distributed-backend nccl \
       --lr 0.00015 \
       --min-lr 1.0e-5 \
       --lr-decay-style cosine \
       --weight-decay 1e-2 \
       --clip-grad 1.0 \
       --lr-warmup-fraction .01 \
       --checkpoint-activations \
       --log-interval 100 \
       --save-interval 10000 \
       --eval-interval 1000 \
       --eval-iters 10 \
       --fp16
    ```
    
    と変更する。
    
    `bash examples/pretrain.sh`で実行できる
    
    
    (module loadなどは適時お願いします)
3. 1 node 8 GPU での実験

    torchrun が 推奨なのですが、examplesは `python -m torch.distributed.lanch`となっています。(pytorch2.0系からwarningが出るようになっていますが、とりあず気にせず実行しましょう)
    
    先程と同様に`DATA_PATH`, `CHECKPOINT_PATH`を書き換えます。
    その後、さらに
    ```
        --vocab-file dataset/gpt2-vocab.json \
        --merge-file datasetgpt2-merges.txt \
    ```
    を書き換えます。
    
    MASTER_PORT=6000で問題ないようならそのままで良いです。
    (衝突の可能性がある場合は、衝突の可能性がなさそうなportを指定しましょう`例 12345`とか)
    
    `bash examples/pretrain_gpt_distributed.sh`
    で動くはずです。
    
    
## 補足

```
File "/home/<user>/<path>/Megatron-DeepSpeed/megatron/data/gpt_dataset.py", line 289, in _build_index_mappings
from megatron.data import helpers
ImportError: cannot import name 'helpers' from 'megatron.data'
```

上記のエラーが出た場合は以下のリンクを参照ください
(横田研lab server上で CUDA11.6で環境構築をした際の手順が書かれています)
    
https://github.com/okoge-kaz/Megatron-DeepSpeed/blob/feature/format-by-black/examples/README.md
