「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を含むさまざまな人気モデルをサポートしています。

通常、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つのパートに分けてウォークスルーします:

  1. Llama2-7bモデルの微調整し、モデルアーティファクトを指定されたAmazon S3バケットの場所にアップロードします。
  2. 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は、DeepSpeedFasterTransformerなど、多くのディープラーニング最適化ライブラリをサポートしています。モデル固有の設定については、serving.propertiesファイルを使用して、tensor_parallel_degreemodel_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!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

データサイエンス

『ブンブンの向こう側 産業における生成型AIの実用的な応用を探求する』

イントロダクション 現代の世界は「ジェネレーティブAI」という言葉で賑わっています。McKinsey、KPMG、Gartner、Bloombergな...

機械学習

「Google DeepMindが、7100万件の「ミスセンス」変異の効果を分類する新しいAIツールを発表」

人類遺伝学における最大の課題は、おそらく人間のゲノムの複雑さと、健康と病気に寄与する遺伝要因の広範な多様性です。人間...

データサイエンス

「GenAIのモデルの出力を改善する方法」

ジェネレーティブAIは、DLアルゴリズムのおかげで強力なコンテンツ生成器に進化しましたただし、より正確な結果を得るために...

AI研究

新しい研究論文が、化学の論文がChatbot ChatGPTを使用して書かれた時に簡単に見分けることができる機械学習ツールを紹介しています

AIの進歩が支配的な時代において、特に科学論文における人間とAIによるコンテンツの区別はますます重要になっています。この...

データサイエンス

「生成型AIアプリケーションのためのプレイブック」

この記事では、Generative AIアプリケーションを実装する際の主要な考慮事項と、ビジョンを行動に変えるために人間の関与が果...

データサイエンス

単一のマシンで複数のCUDAバージョンを管理する:包括的なガイド

私の以前の役職の一つでAIコンサルタントとして、仮想環境をPython環境を管理し、分離するツールとして利用するという課題が...