「QLoRAを使ってLlama 2を微調整し、AWS Inferentia2を使用してAmazon SageMakerに展開する」
『QLoRAを活用してLlama 2を洗練させ、AWS Inferentia2を用いてAmazon SageMakerに展開する』
この投稿では、AWS Inferentia2でファインチューニングされたLlama 2モデルをパラメータ効率の高いファインチューニング(PEFT)メソッドを使用して紹介し、デプロイします。 AWS Inferentia2デバイスにアクセスし、その高いパフォーマンスを活用するために、AWS Neuronソフトウェア開発キット(SDK)を使用します。次に、Deep Java Library(DJLServing)によってパワードされた大規模モデル推論コンテナを使用して、モデルのサービングソリューションを提供します。
解決策の概要
QLoRaを使用した効率的なファインチューニング Llama2
Llama 2ファミリーは、7兆から70兆のパラメータ範囲で構成される事前学習およびファインチューニングされた生成テキストモデル(LLM)のコレクションです。 Llama 2は、公開されているデータの2兆トークンから事前学習されました。 AWSのお客様は、しばしばLlama 2モデルをサービスダウンストリームのタスクに対してより優れたパフォーマンスを実現するために、自分自身のデータを使用してファインチューニングします。ただし、Llama 2モデルのパラメータの数が多いため、完全なファインチューニングはコストがかかり時間がかかる場合があります。パラメータ効率の高いファインチューニング(PEFT)アプローチは、予め学習されたモデルのほとんどのパラメータをフリーズしながら、わずかな追加モデルパラメータのみをファインチューニングすることで、この問題を解決することができます。PEFTに関する詳細情報については、この投稿を参照してください。この投稿では、QLoRaを使用してLlama 2 7Bモデルをファインチューニングします。
Amazon SageMakerを使用してInf2上でファインチューニングされたモデルをデプロイする
AWS Inferentia2は、推論ワークロードに特化した機械学習(ML)アクセラレータであり、AWS上の他の推論最適化されたインスタンスに比べて、生成AIおよびLLMワークロードに対して最大40%低コストで高性能を提供します。この投稿では、AWS Inferentia2を搭載したAmazon Elastic Compute Cloud(Amazon EC2)のInf2インスタンスを使用します。各インスタンスには第2世代のInferentia2アクセラレータが搭載され、それぞれに2つのNeuronCores-v2が含まれています。各NeuronCore-v2は独立したヘテロジニアスな計算ユニットであり、Tensor、Vector、Scalar、およびGPSIMDエンジンの4つのメインエンジンを備えています。データの局所性を最大化するために、オンチップのソフトウェア管理SRAMメモリも搭載されています。 Inf2についてのさまざまなブログが公開されているため、詳細についてはこの投稿とドキュメントを参照してください。
Inf2にモデルをデプロイするためには、インフルエンシアハードウェアの上で動作するソフトウェアレイヤーとしてAWS Neuron SDKが必要です。 AWS Neuronは、AWS InferentiaおよびAWS Trainiumベースのインスタンスでディープラーニングワークロードを実行するために使用されるSDKです。これにより、新しいモデルを構築し、これらのモデルをトレーニングおよび最適化し、本番環境に展開するためのエンドツーエンドのML開発ライフサイクルを可能にします。 AWS Neuronには、TensorFlowやPyTorchなどの人気のあるフレームワークとネイティブに統合されたコンパイラ、ランタイム、およびツールが含まれています。このブログでは、トランスフォーマーデコーダの推論ワークフローに対応しているAWS Neuron SDKの一部であるtransformers-neuronx
を使用します。これはLlama 2を含むさまざまな人気モデルをサポートしています。
- マイクロソフトAIがLLMLinguaを発表:大型言語モデル(LLM)の高速推論のためのユニークなクイック圧縮テクニックでプロンプトを圧縮
- Amazon BedrockとAmazon Transcribeを使用して、生成AIを使用して録音のサマリーを作成します
- 空からのパイ:ドローンスタートアップがピザ、薬物、そして興奮をお届けします
通常、Amazon SageMakerにモデルを展開するためには、Neuron SDKやtransformers-neuronx
など必要なライブラリを含んだコンテナを使用します。Amazon SageMakerでは、大規模モデルのホスティングに、人気のあるオープンソースライブラリを備えたディープラーニングコンテナ(DLC)を提供しています。この記事では、Neuron用の大規模モデル推論コンテナを使用しています。このコンテナには、Inf2上でLlama 2モデルを展開するために必要なすべての要素が含まれています。Amazon SageMakerでLMIを始めるためのリソースについては、当社の既存の記事(ブログ1、ブログ2、ブログ3)を参照してください。簡単に言えば、追加のコードを書かずにコンテナを実行することができます。シームレスなユーザーエクスペリエンスのためにデフォルトのハンドラを使用し、サポートされているモデル名とロード時の設定可能パラメータの1つを指定します。これにより、Inf2インスタンス上でLLMがコンパイルされ、提供されます。たとえば、OpenAssistant/llama2-13b-orca-8k-3319
を展開する場合、serving.properties
ファイルとして次の構成を指定できます。 serving.properties
では、モデルタイプをllama2-13b-orca-8k-3319
、バッチサイズを4、テンソル並列度を2として指定しています。設定可能なパラメータの完全なリストについては、All DJL configuration optionsを参照してください。
# 使用するエンジン:MXNet、PyTorch、TensorFlow、ONNX、PaddlePaddle、DeepSpeedなど engine = Python # モデルサービスのためのデフォルトハンドラoption.entryPoint = djl_python.transformers_neuronx # モデルのHugging Face IDまたはモデルアーティファクトのs3 URLを指定します。 option.model_id = meta-llama/Llama-2-7b-chat-hf # 動的バッチサイズ(デフォルトは1)option.batch_size=4 # このオプションはモデルに実行するテンソル並列パーティションの数を指定します。option.tensor_parallel_degree=2 # 入力シーケンス長option.n_positions=512 # "auto"、"scheduler"、"lmi-dist"のいずれかを使用してイテレーションレベルのバッチ処理を有効にする.option.rolling_batch=auto # モデルで使用するデータ型のデフォルトオプション.dtype=fp16 # ワーカーモデルの読み込みタイムアウトoption.model_loading_timeout=1500
または、この例に示すように、独自のモデルハンドラファイルを作成することもできますが、これにはDJLServing APIとの間のモデルの読み込みと推論メソッドの実装が必要です。
前提条件
このブログ記事で説明されているモデルを展開するための前提条件は次のとおりです。これらは、AWS Management ConsoleまたはAWS Command Line Interface(AWS CLI)の最新バージョンを使用して実装できます。
ウォークスルー
以下のセクションでは、コードを2つのパートに分けてウォークスルーします:
- Llama2-7bモデルの微調整し、モデルアーティファクトを指定されたAmazon S3バケットの場所にアップロードします。
- Inferentia2にモデルをデプロイします。デプロイには、Amazon SageMakerにホストされたDJLサービングコンテナを使用します。
完全なコードサンプルと手順は、このGitHubリポジトリで見つけることができます。
パート1:PEFTを使用してLlama2-7bモデルを微調整する
このセクションでは、Tim Dettmersらによる論文QLoRA: Quantization-aware Low-Rank Adapter Tuning for Language Generationで最近導入された手法を使用します。QLoRAは、パフォーマンスを損なうことなく、大規模な言語モデルのメモリ使用量を削減するための新しい技術です。
注意:以下に示すllama2-7bモデルの微調整は、Python 2.0 GPU Optimized Kernelを使用したml.g5.2xlargeインスタンスタイプを使用して、Amazon SageMaker Studio Notebookでテストされました。ベストプラクティスとして、Amazon SageMaker Studio 統合開発環境(IDE)を使用し、独自のAmazon Virtual Private Cloud(Amazon VPC)で起動してください。これにより、標準のAWSネットワーキングおよびセキュリティ機能を使用して、VPC内外のネットワークトラフィックを制御、監視、検査することができます。詳細については、プライベートVPCを使用してAmazon SageMaker Studioの接続を保護するを参照してください。
ベースモデルを量子化する
まず、以下のように、4ビットの量子化を使用して量子化モデルをロードします。Huggingface transformersライブラリを使用します:
# ファインチューニング用のベースプリトレーニングモデルmodel_name = "NousResearch/Llama-2-7b-chat-hf"# 使用するデータセットdataset_name = "mlabonne/guanaco-llama2-1k"# 4ビット精度のベースモデルをアクティベートuse_4bit = Truebnb_4bit_compute_dtype = "float16"bnb_4bit_quant_type = "nf4"use_nested_quant = Falsecompute_dtype = getattr(torch, bnb_4bit_compute_dtype)bnb_config = BitsAndBytesConfig(load_in_4bit=use_4bit,bnb_4bit_quant_type=bnb_4bit_quant_type,bnb_4bit_compute_dtype=compute_dtype,bnb_4bit_use_double_quant=use_nested_quant,)# ベースモデルとトークナイザをロードmodel = AutoModelForCausalLM.from_pretrained(model_name,quantization_config=bnb_config,device_map=device_map)model.config.pretraining_tp = 1tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
トレーニングデータセットをロードする
次に、以下のコードを使用してモデルにフィードするためのデータセットをロードします:
# データセットをロード(ここで処理することもできます)dataset = load_dataset(dataset_name, split="train")
アダプターレイヤーをアタッチする
ここでは、小さなトレーニング可能なアダプターレイヤーをアタッチします。アダプターレイヤーは、Hugging FaceのLoraConfigで定義されています。
# LoRAを適用するための線形層を含めるmodules = find_all_linear_names(model)## LoRA設定のセットアップlora_r = 64# LoRAスケーリングのアルファパラメータlora_alpha = 16# LoRA層のドロップアウト確率lora_dropout = 0.1peft_config = LoraConfig(lora_alpha=lora_alpha,lora_dropout=lora_dropout,r=lora_r,bias="none",task_type="CAUSAL_LM",target_modules=modules)
モデルをトレーニングする
上記のLoRAの設定を使用して、Llama2モデルをハイパーパラメータとともにファインチューニングします。モデルをトレーニングするためのコードスニペットは以下の通りです:
# 訓練パラメータを設定するtraining_arguments = TrainingArguments(...)trainer = SFTTrainer(model=model,train_dataset=dataset,peft_config=peft_config, # LoRA configdataset_text_field="text",max_seq_length=max_seq_length,tokenizer=tokenizer,args=training_arguments,packing=packing,)# モデルをトレーニングするtrainer.train()# トレーニング済みモデルを保存するtrainer.model.save_pretrained(new_model)
モデルの重みをマージする
上記で実行したファインチューニングモデルは、トレーニング済みのLoRAアダプタの重みを含む新しいモデルを作成しました。次のコードスニペットでは、アダプタをベースモデルにマージしてファインチューニングモデルを推論に使用できるようにします。
# FP16でモデルを再読み込みし、LoRAの重みとマージするbase_model = AutoModelForCausalLM.from_pretrained(model_name,low_cpu_mem_usage=True,return_dict=True,torch_dtype=torch.float16,device_map=device_map,)model = PeftModel.from_pretrained(base_model, new_model)model = model.merge_and_unload()save_dir = "merged_model"model.save_pretrained(save_dir, safe_serialization=True, max_shard_size="2GB")# トークナイザを再読み込みして保存するtokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)tokenizer.pad_token = tokenizer.eos_tokentokenizer.padding_side = "right"tokenizer.save_pretrained(save_dir)
モデルの重みをAmazon S3にアップロードする
パート1の最終ステップでは、マージされたモデルの重みを指定したAmazon S3の場所に保存します。モデルの重みは、Inferentia2インスタンスを使用してモデルをホストするためのAmazon SageMakerのモデルサービングコンテナで使用されます。
model_data_s3_location = "s3://<bucket_name>/<prefix>/"!cd {save_dir} && aws s3 cp —recursive . {model_data_s3_location}
パート2:AWS Inf2を使用したSageMaker LMIコンテナを使用したQLoRAモデルの推論ホスト
このセクションでは、QLoRAファインチューニングモデルをAmazon SageMakerホスティング環境に展開する手順を説明します。私たちは、SageMaker DLC からのDJLサービングコンテナを使用します。これは、transformers-neuronxライブラリと統合されており、モデルのロードを容易にし、AWS Inferentia2アクセラレータ上でモデルを並列化し、HTTPエンドポイント経由でのサービス提供を可能にします。
モデルアーティファクトを準備する
DJLは、DeepSpeed、FasterTransformerなど、多くのディープラーニング最適化ライブラリをサポートしています。モデル固有の設定については、serving.properties
ファイルを使用して、tensor_parallel_degree
やmodel_id
などのキーパラメータを指定します。 model_id
は、Hugging FaceモデルのIDまたはモデルの重みが保存されているAmazon S3のパスであることができます。この例では、ファインチューニングモデルのAmazon S3の場所を指定しています。次のコードスニペットは、モデルサービスに使用されるプロパティを示しています:
%%writefile serving.propertiesengine=Pythonoption.entryPoint=djl_python.transformers_neuronxoption.model_id=<モデルデータのS3の場所>option.batch_size=4option.neuron_optimize_level=2option.tensor_parallel_degree=8option.n_positions=512option.rolling_batch=autooption.dtype=fp16option.model_loading_timeout=1500
詳細な情報については、serving.properties
で使用可能な設定オプションに関するこのドキュメントを参照してください。 このブログでは、AWS Neuronのコンパイル時間を短縮するために、 option.n_position=512
を使用しています。より大きな入力トークン長を試す場合は、事前にモデルをコンパイルすることをお勧めします(詳細はAOT Pre-Compile Model on EC2を参照)。それ以外の場合、コンパイル時間が長すぎる場合にタイムアウトエラーが発生する可能性があります。
サービング.propertiesファイルが定義された後、ファイルを次のようにtar.gz形式にパッケージ化します:
%%shmkdir mymodelmv serving.properties mymodel/tar czvf mymodel.tar.gz mymodel/rm -rf mymodel
次に、tar.gzをAmazon S3バケットの場所にアップロードします:
s3_code_prefix = "large-model-lmi/code"bucket = sess.default_bucket() # アーティファクトを保持するバケットcode_artifact = sess.upload_data("mymodel.tar.gz", bucket, s3_code_prefix)print(f"S3コードまたはモデルtarボールがアップロードされました --- > {code_artifact}")
Amazon SageMakerモデルエンドポイントを作成する
サービス用にInf2インスタンスを使用するために、Amazon SageMaker LMIコンテナとDJL neuronXサポートを使用します。インファレンスにDJL NeuronXコンテナを使用するには、このポストを参照してください。次のコードは、Amazon SageMaker Python SDKを使用してモデルを展開する方法を示しています:
# DJL-neuronxのDockerイメージURIを取得しますimage_uri = image_uris.retrieve(framework="djl-neuronx",region=sess.boto_session.region_name,version="0.24.0")# サービングに使用するinf2インスタンスタイプを定義しますinstance_type = "ml.inf2.48xlarge"endpoint_name = sagemaker.utils.name_from_base("lmi-model")# 推論用にモデルを展開しますmodel.deploy(initial_instance_count=1,instance_type=instance_type,container_startup_health_check_timeout=1500,volume_size=256,endpoint_name=endpoint_name)# リクエストとレスポンスはJSON形式なので、シリアライザとデシリアライザを指定しますpredictor = sagemaker.Predictor(endpoint_name=endpoint_name,sagemaker_session=sess,serializer=serializers.JSONSerializer(),)
モデルエンドポイントをテストする
モデルが正常に展開された後、サンプルリクエストを予測器に送信することでエンドポイントを検証できます:
prompt="機械学習とは何ですか?"input_data = f"<s>[INST] <<SYS>>\nデータサイエンティストとして\n<</SYS>>\n{prompt} [/INST]"response = predictor.predict({"inputs": input_data, "parameters": {"max_new_tokens":300, "do_sample":"True"}})print(json.loads(response)['generated_text'])
サンプルの出力は以下のように表示されます:
データ分析の文脈で、機械学習(ML)は、統計的技術の一種であり、データセットから予測力を抽出し、次第に統計量の範囲を狭めて複雑さと精度を増していくものです。
機械学習は新しい統計的技術ではなく、既存の技術の組み合わせです。さらに、特定のデータセットを使用したり特定の結果を生成するために設計されたわけではありません。むしろ、任意のデータセットに適応し、任意の結果について予測する柔軟性を持つように設計されています。
クリーンアップ
SageMakerエンドポイントを継続して実行する必要がなくなった場合は、Python用AWS SDK (boto3)、AWS CLI、またはAmazon SageMakerコンソールを使用して削除できます。さらに、必要なくなったAmazon SageMaker Studioのリソースをシャットダウンすることもできます。
結論
この記事では、Llama2-7bモデルをLoRAアダプタを使用して単一のGPUインスタンスで4ビットの量子化を行う方法を紹介しました。次に、DJLサービングコンテナを使用してAmazon SageMakerにモデルを展開しました。最後に、SageMaker Python SDKを使用してAmazon SageMakerモデルエンドポイントをテキスト生成予測で検証しました。ぜひ試してみて、フィードバックをお聞かせください。AWS Inferentiaに関する新機能や新しいイノベーションのアップデートにご期待ください。
AWS Neuronに関するさらに多くの例はaws-neuron-samplesを参照してください。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- ミストラルの最先端言語モデル、Mixtral 8x7bをご紹介しますGPT-3.5を超えるオープンアクセスAIです
- 04/12から10/12までの週のための重要なコンピュータビジョン論文トップ
- 「なぜマイクロソフトのOrca-2 AIモデルは持続可能なAIにおいて重要な進展を示すのか?」
- 確定論的 vs 確率的 – 機械学習の基礎
- ギガGPTに会ってください:CerebrasのnanoGPTの実装、Andrei Karpathyの効率的なコードでGPT-3のサイズのAIモデルを訓練するためにわずか565行のコード
- 「vLLMの解読:言語モデル推論をスーパーチャージする戦略」
- 「2024年の包括的なNLP学習パス」