deepspeed 다중 기계 다중 카드 병렬 교육 가이드


머리말

내 구성:

7대의 머신과 14개의 카드, 서버당 A800 카드 2개

질문: 왜 각 기계에는 카드가 2개만 있습니까?
답변: 이것이 제가 받은 것입니다. 차라리 단일 머신에 8개의 카드를 갖고 싶습니다. 그러나 이러한 서버는 클라우드 공급업체에서 제공합니다. 모두 PCIE 연결이며 단일 머신은 최대 4개까지만 가질 수 있습니다. 카드.

서버는 내부 네트워크 접속만 허용하고, 외부 네트워크 접속은 불가능합니다.

따라서 먼저 오프라인에서 훈련 환경을 구성하는 방법을 파악해야 합니다.

교육 환경을 오프라인으로 구성

자세한 내용은 Anaconda 환경 복제 및 마이그레이션을 참조하세요.

위 문서에 따라 환경을 패키징할 때 다음 오류가 발생할 수 있습니다. 다음과 같은
여기에 이미지 설명을 삽입하세요.
매개변수를 추가하면 문제 --ignore-missing-files를 해결할 수 있습니다.
conda pack -n 环境名 -o 新的环境名.tar.gz --ignore-missing-files

공유 파일 시스템

일반적으로 다중 기계 및 다중 카드 훈련을 위해 공유 파일 시스템을 구성하면 많은 이점이 있습니다.예를 들어 데이터 세트 및 모델의 사본 하나만 저장하면 됩니다.더 중요한 것은 모델을 저장할 때 모델을 저장하는 것입니다. 공유 파일 시스템에.이 경우 모델의 여러 복사본을 저장할 필요가 없습니다.공유 파일 시스템이 없는 경우 각 서버에 모델 매개 변수의 복사본을 저장해야 합니다.

중단점 재훈련을 원할 때 각 머신의 최적화 매개변수를 수동으로 병합해야 하는데 이는 매우 번거로운 작업입니다.

실제로 공유 파일 시스템이 없다면 어떻게 될까요?
해결책:

방법 1. 다음과 같이 deepspeed의 checkpoint매개변수를 구성합니다.use_node_local_storage

"checkpoint": {
    
    
    "use_node_local_storage": true
}

추가하는 방법을 이해하지 못하는 경우 deepspeed stage2구성 예는 다음과 같습니다.

{
    
    
    "bfloat16": {
    
    
        "enabled": false
    },
    "fp16": {
    
    
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    },
    "optimizer": {
    
    
        "type": "AdamW",
        "params": {
    
    
            "lr": "auto",
            "betas": "auto",
            "eps": "auto",
            "weight_decay": "auto"
        }
    },
    "zero_optimization": {
    
    
        "stage": 2,
        "allgather_partitions": true,
        "allgather_bucket_size": 2e8,
        "overlap_comm": true,
        "reduce_scatter": true,
        "reduce_bucket_size": "auto",
        "contiguous_gradients": true
    },
    "gradient_accumulation_steps": "auto",
    "gradient_clipping": "auto",
    "steps_per_print": 1e5,
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "wall_clock_breakdown": false,
	"checkpoint": {
    
    
	    "use_node_local_storage": true
	}
}

매개변수 설명
여기에 이미지 설명을 삽입하세요.

원본 문서: https://www.deepspeed.ai/docs/config-json/

방법 2: TrainingArguments구성 매개변수를 추가하기 --save_on_each_node만 하면 됩니다 .

실제로 Huggingface의 deepspeed 플러그인 문서에는 공유 파일 시스템이 없는 상황에 대한 설명이 나와 있는데, 찾기가 정말 어렵습니다 . #-비공유 파일 시스템 사용

여기에 이미지 설명을 삽입하세요.
위의 두 가지 방법 모두 공유 파일 시스템 없이는 재교육을 할 수 없는 문제를 해결할 수 있습니다.

위의 구성을 사용한 경우 발생할 수 있는 또 다른 문제는 재개 경로를 사용하여 훈련을 재개할 때 아래와 같은 위치에 멈출 수 있다는 것입니다.

여기에 이미지 설명을 삽입하세요.
여기에 코드가 갇히고 GPU가 점유되어 GPU 사용률도 표시됩니다. 이때 자신의 코드가 device_map인지 확인해야 합니다 auto. 그렇지 않으면 반드시 여기에 갇힐 것입니다.

, 그러나 device_map="auto"코드가 여전히 여기에 붙어 있는 경우 가능한 해결책: 여기에 이미지 설명을 삽입하세요.
이 그림은 다음에서 참조됩니다: Deepspeed 다중 기계 다중 카드 훈련의 함정

여러 서버 간에 비밀번호가 필요 없는 상호 로그인 구성

SSH 원격 로그인: 둘 이상의 서버 간 비밀번호 없는 로그인 설정을 참조하세요.

이것은 꼭 해야 할 일이고, 시간을 많이 절약할 수 있으므로 처음에 바로 하는 것이 가장 좋습니다.

DPA

각 서버에 pdsh를 설치합니다. 설치 방법:

#下载解压
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/pdsh/pdsh-2.29.tar.bz2 && tar -xf pdsh-2.29.tar.bz2 -C /root/pdsh
#编译安装
cd pdsh-2.29 && ./configure --with-ssh --enable-static-modules --prefix=/usr/local && make && make install
#测试
pdsh -V

경로를 자신의 것으로 변경하면 됩니다.오프라인 서버인 경우 먼저 인터넷이 연결된 서버에서 pdsh를 다운로드한 후 오프라인 서버에 복사하여 설치할 수 있습니다.

Doka 교육 중 발생할 수 있는 문제

질문 1: Ninja가 설치되었습니다. deepspeed 다중 기계 다중 카드 RuntimeError: Ninja는 C++ 확장을 로드해야 합니다.
답변 1:
훈련 코드 시작 부분에 추가하십시오:

/root/anaconda3/envs/baichuan/bin:서버의 conda 가상 환경의 bin 디렉터리입니다.

local_env = os.environ.copy()
local_env["PATH"]= "/root/anaconda3/envs/baichuan/bin:" + local_env["PATH"]
os.environ.update(local_env)

问题2:libcudart.so.12.2: 공유 객체 파일을 열 수 없습니다: 해당 파일이나 디렉터리가 없습니다
答案2:

1、检查文件libcudart.so.12.2是否存在(正常来说都是存在的),不存在该文件的话,需要重装cuda
2、在命令行执行 sudo ldconfig /usr/local/cuda-12.2/lib64

알아채다

훈련을 실행하기 위한 코드는 각 머신에서 정확히 동일해야 하며, 사람들을 대머리로 만들 수 있는 이상한 오류 보고를 피하기 위해 저장 경로(소프트웨어 설치 경로 등 포함)가 일관되어야 합니다.

요약하다

실제로 멀티머신, 멀티카드 트레이닝을 해본 학생들은 이 글이 얼마나 상세한지 이해할 수 있을 것입니다! 유익한 정보가 가득하다고 해도 과언이 아닙니다! 좋아요와 수집을 하시길 바랍니다.

추천

출처blog.csdn.net/qq_44193969/article/details/132612837