
Kaggle에서 새로운 40B LLMS 데모를 사용해보십시오
잠재적 인 선형 속도를 갖춘 한 줄의 코드로 여러 GPU에서 대형 Pytorch 모델을 실행하십시오.
import transformers
import tensor_parallel as tp
tokenizer = transformers . AutoTokenizer . from_pretrained ( "facebook/opt-13b" )
model = transformers . AutoModelForCausalLM . from_pretrained ( "facebook/opt-13b" ) # use opt-125m for testing
model = tp . tensor_parallel ( model , [ "cuda:0" , "cuda:1" ]) # <- each GPU has half the weights
inputs = tokenizer ( "A cat sat" , return_tensors = "pt" )[ "input_ids" ]. to ( "cuda:0" )
outputs = model . generate ( inputs , num_beams = 5 )
print ( tokenizer . decode ( outputs [ 0 ])) # A cat sat on my lap for a few minutes ...
model ( input_ids = inputs , labels = inputs ). loss . backward () # training works as usual 최신 안정 버전 (권장) :
pip install tensor_parallel
출혈 엣지 버전 :
pip install https://github.com/BlackSamorez/tensor_parallel/archive/main.zip
pytorch 모델을 tp.tensor_parallel 로 포장하고 정상적으로 사용하십시오. 최상의 메모리 효율을 보려면 모델이 여전히 CPU에있는 동안 tp.tensor_parallel 로 전화하십시오.
몇 가지 사용 사례는 다음과 같습니다.
examples/training_flan-t5-xl.ipynb 텍스트 요약에 대한 전체 flan-t5 모델을 미세 조정합니다tensor_parallel int8 LLM LLM.8bit + Tensor_Parallel로 대형 언어 모델 어댑터 조정 tensor_parallel 의 고급 매개 변수 :
device_ids: List[device] - 사용할 장치; 사용 가능한 모든 GPU에 대한 기본값output_device: device - 모델 출력에는이 장치가 있습니다tensor_parallel_config: tp.Config 사용자 정의 병렬 처리 전략 사용 slicing_configs.py 참조하십시오distributed: bool -true 인 경우 Torch.displated Backend를 스레딩 대신 사용하십시오 ( torchrun 필요).sharded: bool 사실이라면 텐서 병렬 처리로 분할되지 않은 모든 훈련 가능한 매개 변수를 찾아서 제로 3 알고리즘을 사용하여 분할하십시오.sharded_param_names: List[str] - 이런 식으로 샤드를 해야하는 매개 변수 이름, default = 자동으로 찾았습니다. 비 tensor_parallel 컨텍스트에서 사용할 수 있도록 모델을 저장하려면 save_tensor_parallel 컨텍스트 래퍼를 사용해야합니다.
import torch
import transformers
import tensor_parallel as tp
model = tp . tensor_parallel (
transformers . AutoModelForCausalLM . from_pretrained ( "facebook/opt-13b" ),
)
# A whole lot of trainig...
with tp . save_tensor_parallel ( model ):
torch . save ( model . state_dict (), "/tmp/" )
# or
model . save_pretrained ( "/tmp/" ) 이러한 코드는 분할되지 않은 것처럼 모델을 저장합니다. state_dict 생성 중에 모델 부품을 수집하여 작동합니다.
일반적으로 tensor_parallel 모델을 일반적으로 생성하고 발송하려면 메모리의 전체 모델이 필요합니다. 이것은 번거로울 수 있지만 다른 방법이 있습니다.
기본 모델의 state_dict 헬퍼 함수 convert_state_dict 사용하여 해당 tensor_parallel state_dict 로 변환 할 수 있습니다. 그런 다음 상태 DITT를 모델로 파견하고로드 할 수 있습니다.
import accelerate
import transformers
import tensor_parallel as tp
# Initialize a weightless tensor_parallel model from MyModel
with accelerate . init_empty_weights ():
model = tp . TensorParallel (
MyModel (),
device_ids = [ 0 , 1 ] # and prepare it to be put on GPUs 0 and 1
)
# Load partial state_dict for MyModel
state_dict = torch . load ( "my_model_part_1_of_5.bin" )
# Convert it into a tensor_parallel state_dict
tensor_parallel_state_dict = tp . convert_state_dict (
state_dict ,
tensor_parallel_config = model . tensor_parallel_config ,
world_size = len ( model . devices ),
)
# Dispatch the partial state_dict (load_state_dict doesn't work with meta so here I use accelerate)
device_map = tp . infer_sharded_device_map ( model )
for param_name , param in state_dict . items ():
module_name = param_name
while len ( module_name ) > 0 and module_name not in device_map :
module_name = "." . join ( module_name . split ( "." )[: - 1 ])
param_device = device_map [ module_name ]
accelerate . utils . set_module_tensor_to_device ( model , param_name , param_device , value = param )이를 통해 모델의 한 부분을 한 번에 메모리에로드 할 필요가 없습니다.
Q : 멀티 GPU 서버가 없습니다. Google Colab에서 Tensor_Parallel을 사용할 수 있습니까?
A : Colab에는 단일 GPU가 있으므로 텐서 병렬 처리에는 아무런 의미가 없습니다. 그러나 Kaggle은 모든 전화 보수 계정에 무료로 두 개의 T4를 제공합니다.
Q : 텐서 병렬 처리 가란 무엇입니까?
A : 각 레이어의 가중치를 부품으로 나누고 각 부품을 별도의 GPU에 곱한 다음 결과를 수집합니다. 여기에서 자세히 알아보십시오
Q : TensorParallel 또는 DataParallel 사용해야합니까?
A : 대형 모델의 경우 TensorParallel, 작은 모델의 경우 DataparAllel
Q : FullateShardedDataparAllel 및 Zero와 어떻게 비교됩니까?
A : 큰 배치를 장착 할 수 있다면 Zero가 더 좋습니다. 작은 배치에 대해서는 텐서 파라렐이 더 좋습니다.
tensor_parallel 사용하는 이유 ...
alpaModel.parallelize() 요컨대, 단일 시스템에서 빠른 프로토 타이핑을 위해 tensor_parallel 사용하십시오. 백만 달러 규모의 훈련 실행에 DeepSpeed+Megatron 또는 ALPA를 사용하십시오.
NCCL 오류 또는 임의의 교수형이 발생하면 제대로 표시되지 않은 코드 오류가 발생할 수 있습니다. 이러한 오류를 디버깅하려면 export TENSOR_PARALLEL_USE_NATIVE=1 또는 단일 장치에서 다시 시작하는 것이 좋습니다.
버그를 발견했거나 문제가 발생하면 문제 추적기 에보 고하십시오. 우리는 최선을 다해 도와 줄 것이지만, 우리가 그것을 얻기 전에 시간이 걸릴 수 있습니다. tensor_parallel 과 관련된 문제가있는 경우에만 문제를 만들어주십시오. 예를 들어, transformers 설치하거나 코드를 최적화하는 데 도움이 필요한 경우 다른 곳에서 찾으십시오.
우리는 모든 풀 요청에 검은 색과 동점을 사용합니다. 코드를 커밋하기 전에 단순히 black . && isort . 그리고 당신은 괜찮을 것입니다.