기사 디렉토리
머리말
내 구성:
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
알아채다
훈련을 실행하기 위한 코드는 각 머신에서 정확히 동일해야 하며, 사람들을 대머리로 만들 수 있는 이상한 오류 보고를 피하기 위해 저장 경로(소프트웨어 설치 경로 등 포함)가 일관되어야 합니다.
요약하다
실제로 멀티머신, 멀티카드 트레이닝을 해본 학생들은 이 글이 얼마나 상세한지 이해할 수 있을 것입니다! 유익한 정보가 가득하다고 해도 과언이 아닙니다! 좋아요와 수집을 하시길 바랍니다.