メインコンテンツへスキップ
見出し画像

HuggingFace Accelerate の概要

    「Accelerate」の概要についてまとめました。

    ・Accelerate v0.12.0

    1. Accelerate

    「Accelerate」は、PyTorchの CPU / GPU / TPU 対応を共通コードで書けるようにするためのパッケージです。

    次に例を示します。

    import torch
    import torch.nn.functional as F
    from datasets import load_dataset
    + from accelerate import Accelerator

    + accelerator = Accelerator()
    - device = 'cpu'
    + device = accelerator.device


    model = torch.nn.Transformer().to(device)
    optimizer = torch.optim.Adam(model.parameters())
    dataset = load_dataset('my_dataset')
    data = torch.utils.data.DataLoader(dataset, shuffle=True)

    + model, optimizer, data = accelerator.prepare(model, optimizer, data)

    model.train()
    for epoch in range(10):
        for source, targets in data:
            source = source.to(device)
            targets = targets.to(device)

            optimizer.zero_grad()
            output = model(source)
            loss = F.cross_entropy(output, targets)

            - loss.backward()
            + accelerator.backward(loss)


            optimizer.step()

    学習スクリプトに5 行追加するだけで、任意の単一・分散ノード設定 (single CPU / single GPU / multi-GPU / TPU) で実行できるようになります。デバイス配置も処理するため、学習ループをさらに単純化できます。

    import torch
    import torch.nn.functional as F
    from datasets import load_dataset
    + from accelerate import Accelerator

    - device = 'cpu'
    + accelerator = Accelerator()

    - model = torch.nn.Transformer().to(device)
    + model = torch.nn.Transformer()

    optimizer = torch.optim.Adam(model.parameters())
    dataset = load_dataset('my_dataset')
    data = torch.utils.data.DataLoader(dataset, shuffle=True)

    + model, optimizer, data = accelerator.prepare(model, optimizer, data)

    model.train()
    for epoch in range(10):
        for source, targets in data:
            - source = source.to(device)
            - targets = targets.to(device)


            optimizer.zero_grad()
            output = model(source)
            loss = F.cross_entropy(output, targets)

            - loss.backward()
            + accelerator.backward(loss)


            optimizer.step()

    2. 起動スクリプト

    「Accelerate」には、スクリプトの実行前に学習環境をすばやく設定およびテストできるCLIツールも提供します。

    $ accelerate config
    In which compute environment are you running? ([0] This machine, [1] AWS (Amazon SageMaker)): 0
    Which type of machine are you using? ([0] No distributed training, [1] multi-CPU, [2] multi-GPU, [3] TPU [4] MPS): 0
    Do you want to run your training on CPU only (even if a GPU is available)? [yes/NO]:NO
    Do you want to use DeepSpeed? [yes/NO]: NO
    Do you wish to use FP16 or BF16 (mixed precision)? [NO/fp16/bf16]: NO

    そして聞かれた質問に回答します。これにより、実行時に利用する設定ファイルが生成されます。

    $ accelerate launch my_script.py --args_to_my_script

    3. MPI による multi CPU 実行

    MPI による multi CPU 実行を開始する別の方法を次に示します。Open MPI のインストール方法については、このページで学習できます。 Intel MPI または MVAPICH も使用できます。クラスターで MPI をセットアップしたら、以下を実行します。

    $ mpirun -np 2 python examples/nlp_example.py

    4. DeepSpeed による学習開始

    「Accelerate」は、「DeepSpeed」によるsingle/ multi GPU での学習をサポートします。これを利用するために、コードを変更する必要はありません。Accelerateの設定で設定できます。

    Python スクリプトから DeepSpeed関連の引数をファインチューニングしたい場合は、DeepSpeedPlugin を利用します。

    from accelerator import Accelerator, DeepSpeedPlugin
    
    # deepspeed needs to know your gradient accumulation steps before hand, so don't forget to pass it
    # Remember you still need to do gradient accumulation by yourself, just like you would have done without deepspeed
    deepspeed_plugin = DeepSpeedPlugin(zero_stage=2, gradient_accumulation_steps=2)
    accelerator = Accelerator(fp16=True, deepspeed_plugin=deepspeed_plugin)
    
    # How to save your 🤗 Transformer?
    accelerator.wait_for_everyone()
    unwrapped_model = accelerator.unwrap_model(model)
    unwrapped_model.save_pretrained(save_dir, save_function=accelerator.save, state_dict=accelerator.get_state_dict(model))

    5. ノートブックでの学習開始

    「Accelerate」の分散学習の起動は、ノートブックでも使用できます。notebook_launcher()が提供されており、これはTPUバックエンドを備えた Colab または Kaggleノートブックで役立ちます。

    training_functionで学習ループを定義し、最後のセルに以下を追加します。

    from accelerate import notebook_launcher
    notebook_launcher(training_function)

    使用例は、このノートブックにあります。

     6. Accelerateを使用すべき場合

    学習ループの完全な制御を放棄することなく、分散環境で学習スクリプトを手軽に実行したい場合は、「Accelerate」を使用すべきです。これはPyTorchの高レベルフレームワークではなくラッパーであるため、新しいライブラリを学習する必要はありません。実際、「Accelerate」の 全APIはAcceleratorクラスにあります。

     7. Accelerateを使用すべきでない場合

    自分で学習ループを作成したくない場合は、「Accelerate」を使用すべきではありません。PyTorchに高レベルのライブラリがたくさんあります。



     
     

    npaka

     
     
    プログラマー。iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / ロボット / ガジェット。年2冊ペースで技術書を執筆。アニソン / カラオケ / ギター / 猫 twitter : @npaka123

    あなたへのおすすめ