nnScaler는 단일 GPU 실행을 위해 설계된 심층 신경망(DNN) 모델을 여러 GPU에서 병렬로 실행할 수 있는 프로그램으로 컴파일하는 병렬화 엔진입니다.
사용 편의성: 자동화된 병렬화를 활성화하려면 몇 줄의 코드만 변경하면 됩니다.
Pythonic: 병렬화 출력이 PyTorch 코드에 있으므로 사용자가 이해하기 쉽고 추가 개발이나 사용자 정의가 편리합니다.
확장성: nnScaler는 신흥 모델에 대한 새로운 연산자를 지원하는 API를 제공합니다.
신뢰성: 다양한 엔드투엔드 교육 세션을 통해 검증된 nnScaler는 신뢰할 수 있는 시스템입니다.
성능: nnScaler는 대규모 병렬화 공간을 탐색함으로써 병렬 훈련 성능을 크게 향상시킬 수 있습니다.
DNN 과학자 의 경우 병렬화 복잡성은 nnScaler에 맡기고 단일 GPU에서 PyTorch를 사용하여 모델 설계에 집중할 수 있습니다. 성능 면에서 기존 방법을 능가하는 혁신적인 병렬화 기술을 도입합니다. 또한 nnScaler는 새로운 구조 또는 실행 패턴으로 DNN 모듈 확장을 지원하므로 사용자는 사용자 지정 DNN 모델을 병렬화할 수 있습니다.
DNN 시스템 전문가 의 경우 nnScaler를 활용하여 새로운 모델에 대한 새로운 DNN 병렬화 메커니즘과 정책을 탐색할 수 있습니다. nnScaler가 인식하지 못하는 새로운 연산자에 대해 사용자 정의 기능을 제공함으로써 새로운 DNN 모델의 원활한 병렬화를 보장합니다. 예를 들어, LLM에서 긴 시퀀스 지원을 용이하게 합니다.
nnScaler를 설치하기 전에 다음 패키지를 설치하십시오.
Python >= 3.8, < 3.11 (3.10 is recommanded) PyTorch >= 2.0, < 2.4 (2.2.0 is recommanded)
nnScaler 디렉터리에서 아래 명령을 실행합니다.
pip install -r requirements.txt pip install -e .
게다가 cppimport 오류를 방지하려면 환경 변수 PYTHONPATH 에 nnScaler 디렉터리도 포함해야 합니다.
export NNSCALER_HOME=$(pwd) export PYTHONPATH=${NNSCALER_HOME}:$PYTHONPATH
Llama-3을 실행하는 데 필요한 패키지를 설치합니다. 게다가 플래시 Attn 설치 중에는 특정 버전의 CUDA 라이브러리가 필요합니다. 예를 들어 PyTorch 2.20을 사용하는 경우 CUDA V11.8이 필요합니다.
python -m pip install transformers==4.40.0 flash-attn==2.5.5 tensorboard
HuggingFace에서 Llama-3 모델에 액세스하면 환경 변수로 설정되어야 하는 액세스 토큰을 받게 됩니다.
export HF_TOKEN=<HUGGINGFACE_ACCESS_TOKEN>
examples/llama3_8B_128K
에서 모든 예제 코드를 찾을 수 있습니다. 아래와 같이 사용자는 다음을 수행해야 합니다.
모델 래핑: 손실 계산 및 기타 필요한 구성 요소를 포함합니다.
구성 요소 구성: 모델, 최적화 프로그램 및 데이터로더를 설정합니다.
초기화 및 시작: 기본 기능에서 위 구성으로 nnScaler 트레이너를 만들고 훈련 프로세스를 시작합니다.
# nnscaler.cli.trainer에서 nnScaler 내장 병렬화 가능 트레이너 가져오기 import Trainer# 손실 컴퓨팅 등을 포함하는 랩 모델 class WrapperModel(torch.nn.Module):def __init__(self, model_id):super(). __init__()self.model = AutoModelForCausalLM.from_pretrained(model_id, attn_implementation='flash_attention_2')def 전달(self, 샘플):outputs = self.model.model(input_ids=samples['net_input']['src_tokens'],use_cache=False,return_dict=False, )손실 = torch.sum(chunk_linear_cross_entropy(outputs[0], self.model.lm_head.weight, 샘플['target'], ...))반환 손실, 샘플['ntokens'], 샘플['nsentences'] def main(args):# data configdataloader_config = ... # 모델 configmodel_config = ModelConfig(type=WrapperModel,args={'model_id': 인수.모델_ID, }, )# 최적화 하이퍼파라미터 Optimizer_config = OptimizerConfig(type=MixedPrecisionAdamW,args={'lr': 2e-5, 'betas': (0.9, 0.95), 'weight_decay': 0.0, 'fused': True},#... )#...# 데이터로더/모델/옵티마이저 등의 구성이 포함된 트레이너 설정 트레이너 = Trainer(train_args=TrainerArgs(#...model=model_config,optimizer=optimizer_config,dataloader=dataloader_config,#...))trainer.run()
그런 다음 예제를 시작하면 모든 병렬화 작업이 nnScaler에 의해 자동으로 완료됩니다.
cd example/llama3_8B_128K# 교육 데이터 준비:python bookcorpus.py --data_path_or_name bookcorpus/bookcorpus --tokenizer_path_or_name Meta-llama/Meta-Llama-3-8B-Instruct --save_path ./bookcorpus_llama3_4K --sequence_length 4096# 미니 모델 빌드python create_mini_model.py --model_id Meta-llama/Meta-Llama-3-8B-Instruct --output_id ./llama3_mini#compile 및 데이터 병렬 처리 + zero1torchrun을 사용하여 실행 --nproc_per_node=2 train.py --plan_ngpus 1 --runtime_ngpus 2 --name llama3_debug --model_id ./llama3_mini --dataset_path ./bookcorpus_llama3_4K
또한 nnScaler의 PyTorch Lightning 호환 인터페이스를 통해 모델을 병렬화하는 방법을 보여주는 예도 제공합니다.
nnScaler 저장소에서 nanoGPT 예제를 찾으세요.
CD 예제/nanogpt
nanoGPT의 종속성을 설치합니다.
pip 설치 -r 요구사항.txt
데이터 세트 준비:
파이썬 nanoGPT/데이터/shakespeare_char/prepare.py
단일 GPU로 테스트
이제 torchrun <https://pytorch.org/docs/stable/elastic/run.html>
사용하여 train_nnscaler.py
실행할 수 있습니다.
torchrun --nproc_per_node=1 train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
그러면 단일 GPU에서 베이비 GPT 모델이 훈련됩니다. 몇 분이 소요되며 가장 좋은 검증 손실은 약 1.47입니다.
다중 GPU로 테스트
기본적으로 nnScaler는 데이터 병렬성을 사용하여 GPU를 통해 모델을 병렬화합니다. 노드 하나에 GPU가 4개 있는 경우:
torchrun --nproc_per_node=4 train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
또는 여러 노드가 있는 경우(예: 각각 4개의 GPU가 있는 2개의 노드):
# on each node torchrun --nnodes=2 --nproc_per_node=4 --rdzv-id=NNSCALER_NANOGPT --rdzv-backend=c10d --rdzv-endpoint=<IP> train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
참고: 로컬 배치 크기는 기본적으로 고정되어 있으므로 더 많은 작업자를 사용하면 전역 배치 크기가 더 커집니다.
? 고급 사용법에 대해서는 향후 릴리스를 계속 지켜봐 주시기 바랍니다.
nnScaler는 제품 및 연구 탐구를 포함한 여러 프로젝트에 채택되었습니다.
(YOCO) 한 번만 캐시합니다: 언어 모델을 위한 디코더-디코더 아키텍처
LongRoPE: LLM 컨텍스트 창을 200만 개 이상의 토큰으로 확장
Phi-3 시리즈의 긴 컨텍스트 버전에 대한 사후 교육
여기 지침에 따라 OSDI'24에 대한 아티팩트 평가를 찾을 수 있습니다. 연구에 도움이 되는 경우 간행물에 nnScaler를 인용해 주세요.
@inproceedings{lin2024nnscaler, title = {nnScaler: Constraint-Guided Parallelization Plan Generation for Deep Learning Training}, author={Lin, Zhiqi and Miao, Youshan and Zhang, Quanlu and Yang, Fan and Zhu, Yi and Li, Cheng and Maleki, Saeed and Cao, Xu and Shang, Ning and Yang, Yilei and Xu, Weijiang and Yang, Mao and Zhang, Lintao and Zhou, Lidong}, booktitle={18th USENIX Symposium on Operating Systems Design and Implementation (OSDI 24)}, pages={347--363}, year={2024} }
이 프로젝트는 기여와 제안을 환영합니다. 대부분의 기여는 귀하가 귀하의 기여를 사용할 권리가 있고 실제로 그렇게 할 권리가 있음을 선언하는 기여자 라이센스 계약(CLA)에 동의해야 합니다. 자세한 내용을 보려면 https://cla.opensource.microsoft.com을 방문하세요.
끌어오기 요청을 제출하면 CLA 봇이 자동으로 CLA 제공이 필요한지 여부를 결정하고 PR을 적절하게 장식합니다(예: 상태 확인, 댓글). 봇이 제공하는 지침을 따르기만 하면 됩니다. CLA를 사용하여 모든 저장소에서 이 작업을 한 번만 수행하면 됩니다.
이 프로젝트는 Microsoft 오픈 소스 행동 강령을 채택했습니다. 자세한 내용은 행동 강령 FAQ를 참조하거나 추가 질문이나 의견이 있는 경우 [email protected]으로 문의하세요.
이 프로젝트에는 프로젝트, 제품 또는 서비스에 대한 상표나 로고가 포함될 수 있습니다. Microsoft 상표 또는 로고의 승인된 사용에는 Microsoft의 상표 및 브랜드 지침이 적용되며 이를 따라야 합니다. 이 프로젝트의 수정된 버전에 Microsoft 상표 또는 로고를 사용하면 혼동을 일으키거나 Microsoft 후원을 암시해서는 안 됩니다. 제3자 상표 또는 로고의 사용에는 해당 제3자의 정책이 적용됩니다.
https://github.com/microsoft/nnscaler 또는 Microsoft 내부 저장소 https://aka.ms/ms-nnscaler에서 공개 저장소를 찾을 수 있습니다. 질문이나 문의 사항이 있는 경우 [email protected]으로 문의해 주세요.