훈련 및 추론을위한 변압기 모델의 대기 시간 및 메모리 분석
LLMAnalysis 클래스 사용 많은 공식이나 방정식은 논문, 블로그 등, 대형 언어 모델 (LLM) 또는 변압기의 훈련 또는 추론 대기 시간 및 메모리를 계산하는 방법에 대한 주위에 떠 다니고 있습니다. 종이에 수학을하거나 Excel 시트를 입력하는 대신 let's automate the boring stuff with llm-analysis !
LLM 분석은 지정된 모델, GPU, 데이터 유형 및 병렬 처리 구성을 고려할 때 교육 또는 추론을위한 LLM의 대기 시간 및 메모리 사용을 추정합니다. LLM 분석을 통해 이론적으로 다른 교육/추론 설정을 쉽게 시도하고 다양한 시나리오의 시스템 성능을 더 잘 이해할 수 있습니다.
LLM- 분석이 다음과 같은 질문에 답변하는 데 도움이됩니다.
feasible (OOM을 얻지 않음) 및 교육 또는 추론을위한 optimal (대기 시간 제약 조건으로 처리량 최대화) 설정을 얻는 데 사용할 배치 크기, 데이터 유형, 병렬 처리 체계cost (GPU 시간)을 수행하는 데 주어진 설정에 걸리는 timemodeling change , hardware improvement , quantization , parallelism 등의 성능 이점을 제안하는 경우 대기 시간/메모리 변경 방법)예제 사용 사례를 확인하십시오. LLM 분석을 통해 몇 분 안에 그러한 분석을 수행 할 수 있습니다!
PYPI에서 LLM 분석을 설치하려면 :
pip install llm-analysis최신 개발 빌드를 설치하려면 :
pip install --upgrade git+https://github.com/cli99/llm-analysis.git@main 소스에서 설치하려면 Repo를 복제하고 pip install . 또는 poetry install ( pip install poetry 설치).
LLMAnalysis 클래스 사용 코드에 LLM 분석을 통합하려면 LLMAnalysis 클래스를 사용하십시오. 자세한 내용은 Doc Llmanalysis를 참조하십시오.
LLMAnalysis 는 플롭 및 메모리 효율 숫자와 다음 구성 클래스로 구성됩니다.
ModelConfig 모델 정보, 즉 최대 시퀀스 길이, 변압기 층 수,주의 헤드 수, 숨겨진 차원, 어휘 크기를 다룹니다.GPUConfig GPU 컴퓨팅 및 메모리 사양을 다룹니다DtypeConfig 모델 무게, 활성화 및 임베딩에 사용되는 비트 수를 다룹니다.ParallelismConfig 텐서 병렬 처리 ( tp ), 파이프 라인 병렬 처리 ( pp ), 시퀀스 병렬 처리 ( sp ), 전문가 병렬 처리 ( ep ) 및 데이터 병렬 처리 ( dp )를 다룹니다. 그런 다음 훈련 및 추론 방법을 통해 다른 인수로 LLMAnalysis 쿼리 할 수 있습니다.
LLM- 분석은 명령 줄 인터페이스를 통해 사용하기 쉽도록 두 가지 입력 기능을 제공합니다. 달리다
python -m llm_analysis.analysis train --help또는
python -m llm_analysis.analysis infer --help옵션을 확인하거나 링크 된 문서를 읽으려면 사용 방법을 보려면 예제를 참조하십시오.
전 사전 정의 된 Name-Configuration Mapings ( model_configs , gpu_configs , dtype_configs ) 및 기타 사용자 입력 인수를 사용 train LLMAnalysis 구성하고 쿼리를 수행 infer .
사전 정의 된 매핑은 Model_Configs, GPU_CONFIG 및 DTYPE_CONFIG에서 모델, GPU 및 데이터 유형 구성 json 파일의 런타임에 채워집니다. 쿼리 매핑에 새 모델, GPU 또는 데이터 유형을 추가하려면 해당 폴더에 json 설명 파일을 추가하십시오.
LLM- 분석은 또한 모델 구성 JSON 파일 경로에서 ModelConfig 검색하거나 모델 이름을 가진 포옹 얼굴을 지원합니다.
python -m llm_analysis.analysis train --model_name=local_example_model.json . Model_Configs 폴더에서 모델 구성을 확인하십시오.train 호출하거나 입장 기능을 infer 때 EleutherAI/gpt-neox-20b model_name 으로 사용하십시오. python -m llm_analysis.analysis train --model_name=EleutherAI/gpt-neox-20b --total_num_gpus 32 --ds_zero 3 . 이 방법으로 LLM- 분석은 transformers 에 의존하여 Huggingface.co/Models에서 해당 모델 구성을 찾습니다. 즉, 새로운 모델의 정보는 특정 버전의 Transformers 라이브러리 후에 만 존재합니다. 이름을 통해 최신 모델에 액세스하려면 설치된 transformers 패키지를 업데이트하십시오. 편리한 명령 목록은 사전 정의 된 매핑과 포옹 얼굴에 대한 쿼리 또는 구성을 덤프하기 위해 제공됩니다. 자세한 내용은 python -m llm_analysis.config --help 실행하십시오.
몇 가지 예 :
python -m llm_analysis.config get_model_config_by_name EleutherAI/gpt-neox-20b 인구가있는 맵핑에서 이름으로 ModelConfig 가져옵니다. LLM 분석은 포옹 페이스에서 가져 오려고합니다.
LLAMA 모델은 검색하고, 이후의 transformers 라이브러리로 업데이트하거나, LLAMA 모델에 미리 정의 된 ModelConfig 사용하기 위해서는 적어도 transformers-4.28.1 필요합니다 ( / 모델 이름은 _ 로 대체됩니다).
python -m llm_analysis.config list_gpu_configs사전 정의 된 모든 GPU 구성의 이름을 나열하면 다음으로 쿼리 할 수 있습니다.
python -m llm_analysis.config get_gpu_config_by_name a100-sxm-80gb 해당 GPUConfig 보여줍니다.
플롭 및 메모리 효율을 1 (기본값)으로 설정하면 피크 하드웨어 성능을 가정하므로 훈련 또는 추론 대기 시간을 제공합니다. 모델의 입력 치수를 사용하여 벤치마킹 및 프로파일 링을 통해 현실에 가까운 플롭 또는 메모리 효율을 찾을 수 있습니다.
플롭 효율을 위해 가정을해야한다면, 문헌은 대규모 모델 훈련의 경우 최대 0.5 , 추론을 위해 최대 0.7 ; 0.9 메모리 효율의 공격적인 목표가 될 수 있습니다.
LLM- 분석은 메모리 사용 및 대기 시간의 lower-bound 추정을 제공하는 것을 목표로합니다.
LLM- 분석은 현재 텐서 병렬 처리 (TP), 파이프 라인 병렬 처리 (PP), 시퀀스 병렬 처리 (SP), EP (Expert Parallisism) 및 데이터 병렬 처리 (DP)를 다룹니다.
TP, PP 및 SP는 훈련을 위해 Megatron-LM 에서 사용되는 병렬화 스타일을 채택하고 추론을 위해 FasterTransformer
훈련 분석에서 DP Sharding은 DeepSpeed ZeRO 또는 FSDP 사용한다고 가정합니다. ds_zero DP 샤드 전략을 지정하는 데 사용됩니다
| DS_ZERO | DeepSpeed Zero | FSDP | 샤딩 |
|---|---|---|---|
| 0 | 장애가 있는 | no_shard | 샤드가 없습니다 |
| 1 | 1 단계 | N/A | 샤드 최적화 상태 |
| 2 | 2 단계 | 샤드 _grad_op | 샤드 그라디언트 및 최적화 상태 |
| 3 | 3 단계 | full_shard | 샤드 그라디언트, 최적화 상태, 모델 매개 변수 |
EP는 ep_size 장치의 MLP 전문가 수를 병렬화합니다. 즉, GPU 당 전문가 수는 total number of experts / ep_size 입니다. 따라서 MLP 모듈의 경우 다른 병렬화 치수에 대한 장치 수를 모델의 다른 부분에 비해 ep_size 로 나눕니다.
TP 통신은 ring allreduce 사용하여 계산됩니다. EP 통신은 alltoall 사용하여 계산됩니다. FSDP 또는 DeepSpeed Zero를 사용할 때 모델 무게를 깎지 않는 DP 통신 시간은 추정되고 컴퓨팅 대기 시간과 비교되며,이 둘의 값은 전체 대기 시간에 사용됩니다. 다른 DP 및 PP 커뮤니케이션은 현재로서는 완벽한 계산 및 통신 중첩을 가정 할 때 무시됩니다. 이는 의존성으로 인해 통신이 컴퓨팅과 겹치거나 통신이 너무 길어서 상호 연결이 느리기 때문에 커뮤니케이션이 너무 길어질 때 사실이 아닙니다.
LLM- 분석은 전체 및 선택적 활성화 재 계산을 모두 지원합니다.
| activation_recomputation | 체크 포인트 및 재 계산 |
|---|---|
| 0 | 활성화 재 계산 없음; 가장 많은 양의 메모리가 필요합니다 |
| 1 | 변압기 층의주의 모듈에서주의 계산 (QK^t 행렬 곱하기, SoftMax, SoftMax Dropout 및 V에 대한주의)을 확인합니다. 대형 변압기 모델에서 활성화 재 계산 감소에 기술 된 바와 같이. |
| 2 | 변압기 층의주의 모듈에 대한 입력을 검문소; 주의에 대한 추가 전진 패스가 필요합니다. |
| 3 | 검문서 변압기 층의 모듈 시퀀스 (Layernom-Attention-Layernom)의 입력을 확인합니다. 추가 전방 패스가 필요합니다 (Layernom-Intention-Layernom). |
| 4 | 전체 활성화 재 계산은 입력을 변압기 층에 저장합니다. 최소한의 메모리가 필요합니다. 전체 레이어의 추가 전방 패스가 필요합니다. |
데이터 유형은 비트 수, 32 (FP32, TF32), 16 (FP16, BF16), 8 (int8) 및 4 (int4) 비트 데이터 유형만으로 표현됩니다.
미세 조정은 사전 훈련과 동일하게 ( total_num_tokens 에 의해 제어됨) train 훈련과 동일하게 모델링되므로 전체 (모든 모델 매개 변수) 미세 조정을 가정합니다. 매개 변수 효율적인 미세 조정 (PEFT)이 향후 지원 중입니다.
추론은 대기 시간을 계산할 때 컴퓨팅 및 메모리 작업이 완벽하게 겹치며 메모리 사용량을 계산할 때 최대 메모리 재사용을 가정합니다.
아래의 Todos를 다음에 확인하고 계속 지켜봐 주시겠습니까?! 모든 기여 나 피드백은 매우 환영합니다!
작업에서 LLM 분석을 사용하는 경우 다음을 인용하십시오.
Cheng Li. (2023). LLM-Analysis: Latency and Memory Analysis of Transformer Models for Training and Inference. GitHub repository, https://github.com/cli99/llm-analysis.
또는
@misc{llm-analysis-chengli,
author = {Cheng Li},
title = {LLM-Analysis: Latency and Memory Analysis of Transformer Models for Training and Inference},
year = {2023},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/cli99/llm-analysis}},
}
기여와 제안을 환영합니다.
LLM- 분석은 사전 커밋을 사용하여 코드 형식이 일관되도록합니다. 코드 기여가 포함 된 풀 요청의 경우 Pre-Commit ( pip install pre-commit ) 및 중고 후크 (REPO에 pip install )를 설치하고 PR을 제출하기 전에 코드 (각 GIT 커밋 전에 자동으로 실행)를 설치하십시오.