NVIDIA NeMo Frameworkトレーニング・ジョブの実行

NVIDIA NeMo Framework Launcherは、大規模なLLMトレーニングのために数千のGPUにまたがるエンドツーエンドのNeMo Frameworkトレーニング・ジョブを起動するためのクラウドネイティブ・ツールです。この例では、NeMo Frameworkランチャを使用して、gpt3_5b large言語モデル、データ準備およびトレーニング・ステージを実行します。

NeMoおよびNeMo Frameworkランチャの詳細は、NVIDIAのドキュメントを参照してください。

LLMトレーニング・ワークロードの実行

pythonをインストールし、トレーニング・ワークロードを実行します。

  1. python 3.8をインストールし、ユーザーopcのデフォルトのpythonにします。

    このPython3には、requirements.txtにリストされているpythonモジュールが必要です。Oracle Linux 7 (およびその他のOSリリース)は引き続きpython2です。

    $ sudo yum install -y oracle-softwarecollection-release-el7
    $ sudo yum -y install scl-utils rh-python38
    $ scl enable rh-python38 bash
    $ cat <<EOF >> ~/.bashrc
    [ -f /opt/rh/rh-python38/enable ] && source /opt/rh/rh-python38/enable
    EOF
  2. https://github.com/NVIDIA/NeMo-Megatron-Launcher.でInstallationコマンドを使用します
    $ cd /nfs/scratch
    $ git clone https://github.com/NVIDIA/NeMo-Megatron-Launcher.git
    Cloning into 'NeMo-Megatron-Launcher'...
    remote: Enumerating objects: 29018, done.
    remote: Counting objects: 100% (1062/1062), done.
    remote: Compressing objects: 100% (452/452), done.
    remote: Total 29018 (delta 665), reused 898 (delta 564), pack-reused 27956
    Receiving objects: 100% (29018/29018), 27.66 MiB | 14.16 MiB/s, done.
    Resolving deltas: 100% (18124/18124), done.
    
    $ cd NeMo-Megatron-Launcher
    $ pip install -r requirements.txt --user
    $ pip install --upgrade requests --user

    ノート:

    opc以外のユーザーがクラスタを共有する場合は、sudo pip install -r requirements.txtを持つすべてのユーザーのpythonモジュールをインストールする必要があります。

データ準備

データ準備ステージでは、「山」の著作権のないデータセットのダウンロード、データの抽出(圧縮解除)およびデータの前処理の3つのタスクを実行します。

  1. launcher_scripts/conf/config.yamlを編集します。
    1. ジョブstagedata_preparationに設定します。
      stages:
        - data_preparation
        #- training
    2. launcher_scripts_pathを設定します。
      # Path to NeMo Megatron Launch scripts, should ends with /launcher_scripts
      launcher_scripts_path: /nfs/scratch/NeMo-Megatron-Launcher/launcher_scripts
  2. launcher_scriptsディレクトリから、main.pyを実行してジョブをSlurmに送信します。
    $ cd /nfs/scratch/NeMo-Megatron-Launcher/launcher_scripts
    $ python main.py
    Job nemo-megatron-download_gpt3_pile submission file created at '/nfs/scratch/NeMo-Megatron-Launcher/launcher_scripts/results/download_gpt3_pile/download/nemo-megatron-download_gpt3_pile_submission.sh' 
    . . .
  3. Slurmのsqueueコマンドを使用してオブザーバ・ジョブのステータスを確認します。
    $ squeue
                 JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
        191_[20-29%30]       gpu nemo-meg      opc PD       0:00      1 (Resources)
            192_[0-29]       gpu nemo-meg      opc PD       0:00      1 (Dependency,Priority)
            193_[0-29]       gpu nemo-meg      opc PD       0:00      1 (Dependency)
                191_19       gpu nemo-meg      opc  R       0:50      1 gpu-permanent-node-517
                191_18       gpu nemo-meg      opc  R       0:56      1 gpu-permanent-node-878
    

    ステータス(ST)がRのジョブは、一部のジョブが実行中であることを示します。表示される他のジョブは、リソースを待機しているか、他のジョブが最初に完了するのを待機しています(依存関係)。

    results/download_gpt3_pile/downloadを参照して、完了および実行中のジョブの出力を確認します。Slurmジョブの発行に使用されたbashスクリプトを検索することもできます。スクリプトおよび出力は、予期したとおりに実行されないジョブのトラブルシューティングに役立ちます。
2ノード・クラスタでは、次のステップを実行します。
  • ダウンロードまで90分
  • 抽出まで46分
  • 5時間45分前処理
データ・シャードを30ノードまでパラレル化できる大規模なクラスタでは、実行時間は大幅に短縮されます。

トレーニング

トレーニング・ステージでは、スクリプトを編集してLLMトレーニングを実行します。

  1. launcher_scripts/conf/config.yamlを編集します。
    1. ジョブstagetrainingに設定します。
      stages:
        #- data_preparation
        - training
    2. OCIでNVIDIA NVLinkを構成する変数を追加します。
      env_varsセクションで、これらの変数を追加してOCIでNVIDIA NVLinkを構成します。既存の変数はそのままにしておきますが、新しい値で置き換える変数はコメント・アウトします。
      env_vars:
        TRANSFORMERS_OFFLINE: 0 # (was 1)
        . . .
        RX_QUEUE_LEN: 8192
        IB_RX_QUEUE_LEN: 8192
        UCX_TLS: tcp
        HCOLL_ENABLE_MCAST_ALL: 0
        coll_hcoll_enable: 0
        UCX_NET_DEVICES: ens300
        NCCL_SOCKET_IFNAME: ens300
        NCCL_IB_TIMEOUT: 16
        NCCL_IB_SL: 0
        NCCL_IB_TC: 41
        NCCL_ALGO: Auto  # tree, ring
        NCCL_IB_GID_INDEX: 3
        NCCL_IB_QPS_PER_CONNECTION: 16  # was 4
        NCCL_IB_HCA: \'mlx5_1,mlx5_2,mlx5_3,mlx5_4,mlx5_5,mlx5_6,mlx5_7,mlx5_8,mlx5_9,mlx5_10,mlx5_11,mlx5_12,mlx5_14,mlx5_15,mlx5_16,mlx5_17\'
        NCCL_DEBUG: INFO # Logging level for NCCL. Set to "INFO" for debug information

      詳細は、https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/env.htmlを参照してください。

  2. conf/training/gpt3/5b.yamlを編集します。
    run:
      time_limit: "6-00:00:00"  # allow the training job to run for 6 days
    
    trainer:
      num_nodes: 2 # (was 16) set to the size of your cluster
    
    model:
      micro_batch_size: 2           # (was 4) change to fit in A100/40GB memory
      tensor_model_parallel_size: 2 # (was 1) change to fit in A100/40GB memory
    
      optim:
        bucket_cap_mb: 200 # (was 400)
  3. launcher_scriptsディレクトリから、main.pyを実行してジョブをSlurmに送信します。コマンドsqueueを使用して、ジョブが実行されていることを確認します("R")。
    $ cd /nfs/scratch/NeMo-Megatron-Launcher/launcher_scripts
    $ python main.py
    Job nemo-megatron-gpt3_5b submission file created at '/nfs/scratch/NeMo-Megatron-Launcher/launcher_scripts/results/gpt3_5b/nemo-megatron-gpt3_5b_submission.sh'
    Job nemo-megatron-gpt3_5b submitted with Job ID 285
    $ squeue
                 JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
                   285       gpu nemo-meg      opc  R       0:06      2 gpu-permanent-node-[517,878]
  4. results/gpt3_5b/*のファイルを調べて、出力メッセージおよびエラー・メッセージを表示し、実行中のジョブの進捗状況を監視します。
    LLMトレーニングは、gpt3_5b_nnn.outに次のような行が表示される場合に機能します。
    Training:   0%|          | 0/75375 [00:00<?]
    Epoch 0: :   0%|          | 0/75375 [00:00<?]
    Epoch 0: :   0%|          | 1/75375 [00:52<1089:12:32]
    Epoch 0: :   0%|          | 1/75375 [00:52<1089:13:02 ... train_step_timing in s=52.00]
    Epoch 0: :   0%|          | 2/75375 [01:33<980:51:18 ... train_step_timing in s=52.00]
    Epoch 0: :   0%|          | 2/75375 [01:33<980:51:33 ... train_step_timing in s=46.80]
    Epoch 0: :   0%|          | 3/75375 [02:15<945:29:05 ... train_step_timing in s=46.80]
    Epoch 0: :   0%|          | 3/75375 [02:15<945:29:14 ... train_step_timing in s=45.20]
    Epoch 0: :   0%|          | 4/75375 [02:57<926:40:09 ... train_step_timing in s=45.20]
    Epoch 0: :   0%|          | 4/75375 [02:57<926:40:16 ... train_step_timing in s=44.30]
    Epoch 0: :   0%|          | 5/75375 [03:38<915:10:14 ... train_step_timing in s=44.30]
    Epoch 0: :   0%|          | 5/75375 [03:38<915:10:20 ... train_step_timing in s=43.70]
    Epoch 0: :   0%|          | 6/75375 [04:20<907:25:47 ... train_step_timing in s=43.70]
    Epoch 0: :   0%|          | 6/75375 [04:20<907:25:52 ... train_step_timing in s=41.60]
    Epoch 0: :   0%|          | 7/75375 [05:01<901:53:34 ... train_step_timing in s=41.60]
    Epoch 0: :   0%|          | 7/75375 [05:01<901:53:38 ... train_step_timing in s=41.60]
    Epoch 0: :   0%|          | 8/75375 [05:43<897:38:17 ... train_step_timing in s=41.60]
    Epoch 0: :   0%|          | 8/75375 [05:43<897:38:21 ... train_step_timing in s=41.50]
    Epoch 0: :   0%|          | 9/75375 [06:24<894:16:56 ... train_step_timing in s=41.50]
    Epoch 0: :   0%|          | 9/75375 [06:24<894:16:59 ... train_step_timing in s=41.50]
    Epoch 0: :   0%|          | 10/75375 [07:05<891:30:50 ... train_step_timing in s=41.50]

    これは、各トレーニング・ステップが41.5秒で完了したことを示します。クラスタ内のGPUが増えると、ステップ時間が大幅に短縮されます。