
Kaggleで新しい40B LLMSデモをお試しください
潜在的に線形の速度で潜在的にコードで1つのコードで複数の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テキスト要約でフルフラン-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 - 真実の場合は、スレッドの代わりにtorch.distributed backendを使用します( torchrunが必要)sharded: bool - 真の場合、テンソル並列性によって分割されていないすべてのトレーニング可能なパラメーターを見つけ、ゼロ3アルゴリズムを使用してそれらを分割します。sharded_param_names: List[str] - この方法でシャードする必要があるパラメーター名、デフォルト=自動的に見つかった非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モデルを作成して派遣するには、メモリ内のモデル全体が必要です。これは面倒な場合がありますが、別の方法があります。
ヘルパー関数convert_state_dictを使用して、基本モデルのstate_dictを対応するtensor_parallel state_dictに変換することができます。その後、状態dictを派遣してモデルにロードできます。
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は、すべての電話で検証されたアカウントに無料で2つのT4を提供しています。
Q:テンソル並列症とは何ですか?
A:各レイヤーの重みを部品に分割し、各部品を別のGPUに掛けてから結果を収集します。詳細はこちらをご覧ください
Q: TensorParallelまたはDataParallelを使用する必要がありますか?
A:大型モデルの場合は測定平行、小さいモデルのデータアパレル
Q:完全にゼロとゼロとどのように比較されますか?
A:ゼロは大きなバッチを取り付けることができればより良いです、テンソルパラレルは小さなバッチの方が優れています
tensor_parallelを使用する理由...
alpaModel.parallelize()要するに、単一のマシンでの迅速なプロトタイピングにtensor_parallel使用します。 100万ドルのトレーニングランには、DeepSpeed+MegatronまたはALPAを使用します。
NCCLエラーやランダムハンギングが発生した場合、適切に表示されないコードエラーがある場合があります。これらのエラーをデバッグするには、 export TENSOR_PARALLEL_USE_NATIVE=1または単一のデバイスで再起動することをお勧めします。
バグが見つかった場合、または問題が発生した場合は、問題トラッカーに報告してください。私たちは支援するために最善を尽くしますが、それに到達する前に少し時間がかかるかもしれません。問題が特にtensor_parallelである場合にのみ問題を作成してください。たとえば、 transformersのインストールや最適化のサポートが必要な場合は、他の場所でコードを探してください。
すべてのプルリクエストにブラックとアイソートを使用します。コードをコミットする前に、単にblack . && isort .そして、あなたは大丈夫でしょう。