멀티 노드 사용하기
    • PDF

    멀티 노드 사용하기

    • PDF

    Article Summary

    The latest service changes have not yet been reflected in this content. We will update the content as soon as possible. Please refer to the Korean version for information on the latest updates.

    VPC 환경에서 이용 가능합니다.

    주의

    CLOVA NSML은 현재 Closed Beta로 일부 파트너사에게만 제공되어 있으며, 일반 사용자 대상 오픈 시기는 미정입니다.

    CLOVA NSML에서 Run(실험)을 생성할 때 둘 이상의 노드를 설정하여 분산 학습을 수행할 수 있습니다. 이런 형태를 멀티 노드라고 하며, 실험 단위로 구성할 수 있습니다. 실험을 생성할 때 다음과 같이 실험에 사용할 노드의 수만큼 노드 개수(VM)를 설정하면 됩니다.
    ai-clova-nsml-high-3-3_6_ko

    멀티 노드로 구성된 실험의 각 노드에는 순서대로 번호가 부여되며 이를 랭크라고 부릅니다. 번호는 0부터 1씩 증가하며 노드 환경 변수 NSML_RANK를 통해 각 노드의 랭크를 확인할 수 있습니다. 또한, 각 노드에서 현재 소속된 멀티 노드 실험이 몇 개의 노드로 구성되어 있는지 NSML_WORLD_SIZE 변수를 통해 파악할 수 있습니다.

    예를 들어, 4개의 멀티 노드를 사용하는 실험에서 NSML_WORLD_SIZE 변수의 값은 4이며, 두 번째 노드의 랭크 번호는 1입니다. 아래의 명령으로 각 노드의 랭크 번호와 멀티 노드 구성 크기를 확인할 수 있습니다.

    $ echo $NSML_RANK / $NSML_WORLD_SIZE
    

    멀티 노드로 구성된 실험의 노드는 서로 자유롭게 통신할 수 있으며, 각 노드의 호스트 이름은 노드 환경 변수 NSML_HOST_RANK{n}을 통해 파악할 수 있습니다. 만약, 위 예에서 두 번째 노드의 호스트 이름을 확인하고 싶다면 아래와 같은 명령을 실행하면 됩니다.

    $ echo $NSML_HOST_RANK1
    

    PyTorch를 사용하여 분산 학습을 할 때 torch.distributed API를 사용할 수 있습니다. 이때, 환경 변수를 사용하여 다음과 같이 초기화할 수 있습니다.

    import os
    import torch.distributed as dist
    
    dist.init_process_group(
      backend='nccl',
      init_method=f'tcp://{os.environ['NSML_HOST_RANK0']}:23456',
      world_size=int(os.environ['NSML_WORLD_SIZE']),
      rank=int(os.environ['NSML_RANK']),
    )
    

    뿐만 아니라 다음과 같이 PyTorch가 자동으로 수용하는 환경 변수를 지정할 수도 있습니다.

    export MASTER_PORT=23456
    export MASTER_ADDR="$NSML_HOST_RANK0"
    export WORLD_SIZE="$NSML_WORLD_SIZE"
    export RANK="$NSML_RANK"
    
    ...
    
    dist.init_process_group(backend='nccl')
    

    멀티 노드로 구성된 실험에서는 모든 노드가 동시에 시작되는 것이 보장되지 않습니다. 따라서 모든 노드가 준비될 때까지 작업이나 코드 실행을 기다릴 수 있도록 다음과 같은 스크립트 사용을 권장합니다.

    #!/bin/bash
    
    # 모든 노드가 통신 가능한 상태인지 확인하는 fping 패키지를 설치합니다.
    # 매번 패키지를 설치할 필요없이 개인 이미지로 저장하여 사용하면 편리합니다. 
    sudo apt-get update
    sudo apt-get install fping -y
    
    # 모든 노드가 통신 가능한 상태인지 확인합니다. 
    while ! fping $(seq $NSML_WORLD_SIZE | awk '{ print "node" $1-1 }'); do sleep 1; done
    
    # 모두 통신 가능하다면, 아래 MAIN_COMMAND를 실행하게 됩니다.
    {MAIN_COMMAND}
    

    Was this article helpful?

    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.