For organizations adapting AI foundation models with domain-specific data, the ability to rapidly create and deploy fine-tuned models is key to efficiently delivering value with enterprise generative AI applications.
NVIDIA NIM
offers prebuilt, performance-optimized inference microservices for the latest AI foundation models, including
seamless deployment
of models customized using parameter-efficient fine-tuning (PEFT).
In some cases, it’s ideal to use methods like continual pretraining, DPO, supervised fine-tuning (SFT), or model merging, where the underlying model weights are adjusted directly in the training or customization process, unlike PEFT with low-rank adaptation (LoRA). In these cases, inference software configuration for the model must be updated for optimal performance given the new weights.
Rather than burden you with this often lengthy process, NIM can automatically build a
TensorRT-LLM
inference engine performance optimized for the adjusted model and GPUs in your local environment, and then load it for running inference as part of a single-step model deployment process.
In this post, we explore how to rapidly deploy NIM microservices for models that have been customized through SFT by using locally built, performance-optimized TensorRT-LLM inference engines. We include all the necessary commands as well as some helpful options, so you can try it out on your own today.
Prerequisites
To run this tutorial, you need an NVIDIA-accelerated compute environment with access to 80 GB of GPU memory and which has
git-lfs
installed.
Before you can pull and deploy a NIM microservice in an NVIDIA-accelerated compute environment, you also need an NGC API key.
Navigate to the
Meta Llama 3 8B Instruct
model listing in the NVIDIA API Catalog.
Choose
Login
at the top right and follow the instructions.
When you’re logged in, choose
Build with this NIM
on the
model page
.
Choose
Self-Hosted API
and follow either option to access NIM microservices access:
NVIDIA Developer Program membership with free access to NIM for research, development, and testing only.
The 90-day NVIDIA AI Enterprise license, which includes access to NVIDIA Enterprise Support.
After you provide the necessary details for your selected access method, copy your NGC API key and be ready to move forward with NIM. For more information, see
Launch NVIDIA NIM for LLMs
.
Getting started with NIM microservices
Provide your NGC CLI API key as an environment variable in your compute environment:
export NGC_API_KEY=<<YOUR API KEY HERE>>
You also must point to, create, and modify permissions for a directory to be used as a cache during the optimization process:
export NIM_CACHE_PATH=/tmp/nim/.cache
mkdir -p $NIM_CACHE_PATH
chmod -R 777 $NIM_CACHE_PATH
To demonstrate locally built, optimized TensorRT-LLM inference engines for deploying fine-tuned models with NIM, you need a model that has undergone customization through SFT. For this tutorial, use the
NVIDIA OpenMath2-Llama3.1-8B
model, which is a customization of
Meta’s Llama-3.1-8B
using the
OpenMathInstruct-2
dataset.
The base model must be available as a downloadable NIM for LLMs. For more information about downloadable NIM microservices, see the
NIM Type: Run Anywhere filter
in the NVIDIA API Catalog.
All you need is the weights to this model, which can be obtained in several ways. For this post, clone the model repository using the following commands:
git lfs install
git clone https://huggingface.co/nvidia/OpenMath2-Llama3.1-8B
export MODEL_WEIGHT_PARENT_DIRECTORY=$PWD
Now that you have the model weights collected, move on to the next step: firing up the microservice.
Selecting from available performance profiles
Based on your selected model and hardware configuration, the most applicable inference performance profile available is automatically selected. There are two available performance profiles for local inference engine generation:
Latency:
Focused on delivering a NIM microservice that is optimized for latency.
Throughput:
Focused on delivering a NIM microservice that is optimized for batched throughput.
For more information about supported features, including available precision, see the
Support Matrix
topic in the NVIDIA NIM documentation.
Example using an SFT model
Create a locally built TensorRT-LLM inference engine for OpenMath2-Llama3.1-8B by running the following commands:
docker run -it --rm --gpus all \
--user $(id -u):$(id -g)\
	--network=host \
	--shm-size=32GB \
	-e NGC_API_KEY \
	-e NIM_FT_MODEL=/opt/weights/hf/OpenMath2-Llama3.1-8B \
	-e NIM_SERVED_MODEL_NAME=OpenMath2-Llama3.1-8B \
-v $NIM_CACHE_PATH:/opt/nim/.cache \
-v $MODEL_WEIGHT_PARENT_DIRECTORY:/opt/weights/hf \
nvcr.io/nim/meta/llama-3.1-8b-instruct:1.3.0
The command is nearly identical to the typical command you’d use to deploy a NIM microservice. In this case, you’ve added the extra
NIM_FT_MODEL
parameter, which points to the OpenMath2-Llama3.1-8B model.
With that, NIM builds an optimized inference engine locally. To perform inference using this new NIM microservice, run the following Python code example:
from openai import OpenAI

client = OpenAI(
  base_url = "http://localhost:8000/v1",
  api_key = "none"
)

completion = client.chat.completions.create(
  model="OpenMath2-Llama3.1-8B",
  messages=[{"role":"user","content":"What is your name?"}],
  temperature=0.2,
  top_p=0.7,
  max_tokens=100,
  stream=True
)

for chunk in completion:
  if chunk.choices[0].delta.content is not None:
    print(chunk.choices[0].delta.content, end="")
Video 1. How to Deploy Fine-Tuned AI Models
Building an optimized TensorRT-LLM engine with a custom performance profile
On
supported GPUs
, you can use a similar command to spin up your NIM microservice. Follow the
Model Profile
instructions to launch your microservice and determine which profiles are accessible for it.
export IMG_NAME="nvcr.io/nim/meta/llama-3.1-8b-instruct:1.3.0"
docker run --rm --gpus=all -e NGC_API_KEY=$NGC_API_KEY $IMG_NAME list-model-profiles
Assuming you’re in an environment with two (or more) H100 GPUs, you should see the following profiles available:
tensorrt_llm-h100-bf16-tp2–pp1-throughput
tensorrt_llm-h100-bf16-tp2-pp1-latency
Re-run the command and provide an additional environment variable to specify the desired profile:
docker run --rm --gpus=all \
  -e NGC_API_KEY \
  -e NIM_FT_MODEL=/opt/weights/hf/OpenMath2-Llama3.1-8B \
  -e NIM_SERVED_MODEL_NAME=OpenMath2-Llama3.1-8B \
  -e NIM_MODEL_PROFILE=tensorrt_llm-h100-bf16-tp2-pp1-latency \
  -v $NIM_CACHE_PATH:/opt/nim/.cache \
  -v $MODEL_WEIGHT_PARENT_DIRECTORY:/opt/weights/hf \
  $IMG_NAME
Now that you’ve relaunched your NIM microservice with the desired profile, use Python to interact with the model:
from openai import OpenAI

client = OpenAI(
  base_url = "http://localhost:8000/v1",
  api_key = "none"
)

completion = client.chat.completions.create(
  model="llama-3.1-8b-instruct",
  messages=[{"role":"user","content":"What is your name?"}],
  temperature=0.2,
  top_p=0.7,
  max_tokens=100,
  stream=True
)

for chunk in completion:
  if chunk.choices[0].delta.content is not None:
    print(chunk.choices[0].delta.content, end="")
Conclusion
Whether you’re using
PEFT
or SFT methods for model customization, NIM accelerates customized model deployment for high-performance inferencing in a few simple steps. With optimized TensorRT-LLM inference engines built automatically in your local environment, NIM is unlocking new possibilities for rapidly deploying accelerated AI inferencing anywhere.
Learn more and get started today by visiting the NVIDIA
API catalog
and checking out the
documentation
. To engage with NVIDIA and the NIM microservices community, see the NVIDIA
NIM developer forum
.
Reading Time:
2
minutes
ドメイン固有のデータで AI 基盤モデルを適応させている企業にとって、ファインチューニングされたモデルを迅速に作成し、デプロイする能力は、企業の生成 AI アプリケーションで効率的に価値を提供するための鍵となります。
NVIDIA NIM
は、Parapeter-efficient Fine-tuning (PEFT) を用いてカスタマイズしたモデルの
シームレスなデプロイ
など、最新の AI 基盤モデル向けにビルドされたパフォーマンスを最適化した推論マイクロサービスを提供します。
場合によっては、Low-rank Adaptation (LoRA) を使用した PEFT とは異なり、継続事前学習、DPO、教師ありファインチューニング (SFT: Supervised Fine-tuning)、モデル マージなどの手法を利用し、基礎となるモデルの重みをトレーニングやカスタマイズの過程で直接調整するのが理想的です。このような場合、新しい重みを考慮した最適なパフォーマンスを実現するには、モデルの推論ソフトウェア構成を更新する必要があります。
この長時間を要するプロセスに負担を割くのではなく、NIM は、調整されたモデルと GPU に合わせて最適化した
TensorRT-LLM
推論エンジンをローカル環境でビルドし、ロードし、それを単一ステップのモデル デプロイ プロセスの一環として推論を実行できます。
この投稿では、パフォーマンスを最適化した TensorRT-LLM 推論エンジンをローカルでビルドして、SFT でカスタマイズされたモデルに対する NIM マイクロサービスを迅速にデプロイする方法を説明します。必要なコマンドと便利なオプションもご紹介しますので、是非今すぐお試しください。
前提条件
このチュートリアルを実行するには、80 GB の GPU メモリを持つ NVIDIA アクセラレーテッド コンピューティング環境と
git-lfs
のインストールが必要です。
NVIDIA アクセラレーテッド コンピューティング環境で、NIM マイクロサービスを pull してデプロイするには、NGC API キーも必要です。
NVIDIA API カタログのモデル一覧から
Meta Llama 3 8B Instruct
に移動します。
右上の
[Login]
を選択し、指示に従ってください。
ログインしたら、
モデル ページ
で
[Build with this NIM]
を選択します。
[Self-Hosted API]
を選択し、いずれかのオプションに従って、NIM マイクロサービスへアクセスします。
NVIDIA 開発者プログラムのメンバーであれば、研究、開発、テストに限り NIM に無料でアクセスすることができます。
90 日間の NVIDIA AI Enterprise ライセンスには、NVIDIA Enterprise サポートへのアクセスが含まれています。
選択したアクセス方法に必要な詳細情報を提供したら、NGC API キーをコピーして、NIM を進める準備をします。詳細については、
Launch NVIDIA NIM for LLMs
を参照してください。
NIM マイクロサービスをはじめる
利用中のコンピューティング環境の環境変数として、NGC API キーを提供します。
export NGC_API_KEY=<<YOUR API KEY HERE>>
また、最適化処理中にキャッシュとして使用するディレクトリを作成して、パーミッションを変更して、指定する必要があります。
export NIM_CACHE_PATH=/tmp/nim/.cache
mkdir -p $NIM_CACHE_PATH
chmod -R 777 $NIM_CACHE_PATH
NIM でファインチューニングされたモデルをデプロイするために、最適な TensorRT-LLM 推論エンジンをローカルでビルドする実証には、SFT によってカスタマイズしたモデルが必要です。このチュートリアルでは、
OpenMathInstruct-2
データセットを使用して、
Meta の Llama-3.1-8B
をカスタマイズした
NVIDIA OpenMath2-Llama3.1-8B
モデルを使用します。
ベース モデルは、ダウンロード可能な NIM for LLMs として利用可能でなければなりません。ダウンロード可能な NIM マイクロサービスの詳細については、NVIDIA API カタログの「
NIM Type: Run Anywhere filter
」を参照してください。
必要なのはこのモデルの重みだけで、これはさまざまな方法があります。この投稿では、以下のコマンドを使用してモデル リポジトリをクローンします。
git lfs install
git clone https://huggingface.co/nvidia/OpenMath2-Llama3.1-8B
export MODEL_WEIGHT_PARENT_DIRECTORY=$PWD
これでモデルの重みが収集できたので、次のステップのマイクロサービスの起動に進みます。
利用可能なパフォーマンス プロファイルから選択する
選択したモデルとハードウェアの構成に基づいて、利用可能なものの中から最も適切な推論パフォーマンス プロファイルが自動的に選択されます。ローカル推論エンジンの生成には、以下の 2 つのパフォーマンス プロファイルが利用できます。
レイテンシ:
レイテンシに最適化された NIM マイクロサービスの提供に重点を置きます。
スループット:
バッチ スループットに最適化された NIM マイクロサービスの提供に重点を置きます。
利用可能な精度など、サポート機能の詳細については、NVIDIA NIM ドキュメントの
サポート情報
のトピックを参照してください。
SFT モデルを使用した例
以下のコマンドを実行して、ローカル環境でビルドした OpenMath2-Llama3.1-8B 用の TensorRT-LLM 推論エンジンを作成します。
docker run -it --rm --gpus all \
    --user $(id -u):$(id -g)\
    --network=host \
    --shm-size=32GB \
    -e NGC_API_KEY \
    -e NIM_FT_MODEL=/opt/weights/hf/OpenMath2-Llama3.1-8B \
    -e NIM_SERVED_MODEL_NAME=OpenMath2-Llama3.1-8B \
    -v $NIM_CACHE_PATH:/opt/nim/.cache \
    -v $MODEL_WEIGHT_PARENT_DIRECTORY:/opt/weights/hf \
    nvcr.io/nim/meta/llama-3.1-8b-instruct:1.3.0
このコマンドは、NIM マイクロサービスをデプロイするために使用する典型的なコマンドとほぼ同じです。この場合、追加の NIM_FT_MODEL パラメーターを追加し、OpenMath2-Llama3.1-8B モデルを指しています。
これにより、NIM は最適化された推論エンジンをローカル環境でビルドします。この新しい NIM マイクロサービスを使用して推論を行うには、以下の Python コード サンプルを実行します。
from openai import OpenAI
 
client = OpenAI(
  base_url = "http://localhost:8000/v1",
  api_key = "none"
)
 
completion = client.chat.completions.create(
  model="OpenMath2-Llama3.1-8B",
  messages=[{"role":"user","content":"What is your name?"}],
  temperature=0.2,
  top_p=0.7,
  max_tokens=100,
  stream=True
)
 
for chunk in completion:
  if chunk.choices[0].delta.content is not None:
    print(chunk.choices[0].delta.content, end="")
動画 1. ファインチューニングされた AI モデルをデプロイする方法
カスタム パフォーマンス プロファイルで最適化された TensorRT-LLM エンジンのビルド
サポートされている GPU
なら、同様のコマンドを使用して、NIM マイクロサービスを起動できます。
モデル プロファイル
の手順に従ってマイクロサービスを起動し、どのプロファイルにアクセスできるかを確認します。
export IMG_NAME="nvcr.io/nim/meta/llama-3.1-8b-instruct:1.3.0"
docker run --rm --gpus=all -e NGC_API_KEY=$NGC_API_KEY $IMG_NAME list-model-profiles
H100 GPU を使用していると仮定すると、以下のプロファイルが利用可能であることがわかります。
tensorrt_llm-h100-bf16-tp2-pp1-latency
tensorrt_llm-h100-bf16-tp1-pp1-throughput
コマンドを再実行し、目的のプロファイルを指定する環境変数を追加します。
docker run --rm --gpus=all \
    --user $(id -u):$(id -g)\
    --network=host \
    --shm-size=32GB \
    -e NGC_API_KEY \
    -e NIM_FT_MODEL=/opt/weights/hf/OpenMath2-Llama3.1-8B \
    -e NIM_SERVED_MODEL_NAME=OpenMath2-Llama3.1-8B \
    -e NIM_MODEL_PROFILE=tensorrt_llm-h100-bf16-tp2-pp1-latency \
    -v $NIM_CACHE_PATH:/opt/nim/.cache \
    -v $MODEL_WEIGHT_PARENT_DIRECTORY:/opt/weights/hf \
    $IMG_NAME
目的のプロファイルで NIM マイクロサービスを再起動したので、Python を使用してモデルとやり取りします。
from openai import OpenAI
 
client = OpenAI(
  base_url = "http://localhost:8000/v1",
  api_key = "none"
)
 
completion = client.chat.completions.create(
  model="llama-3.1-8b-instruct",
  messages=[{"role":"user","content":"What is your name?"}],
  temperature=0.2,
  top_p=0.7,
  max_tokens=100,
  stream=True
)
 
for chunk in completion:
  if chunk.choices[0].delta.content is not None:
    print(chunk.choices[0].delta.content, end="")
まとめ
モデルのカスタマイズに
PEFT
または SFT を使用している場合でも、NIM は、高性能な推論のためにカスタマイズされたモデルのデプロイをわずかなステップで簡単に高速化します。最適化された TensorRT-LLM 推論エンジンをローカル環境で自動的にビルドすることで、NIM は、高速化された AI 推論をどこにでも迅速にデプロイできるよう新たな可能性を引き出しています。詳細については、
NVIDIA API カタログ
にアクセスし、NVIDIA NIM ドキュメントの
ファインチューニングされたモデルのサポート
をご覧ください。
NVIDIA NIM 開発者フォーラム
では、NVIDIA および NIM マイクロサービス コミュニティとの交流することもできます。
関連情報
GTC セッション:
Kubernetes 用 Oracle コンテナー エンジンを使用した OCI の NVIDIA Nemotron LLM のファインチューニングとデプロイ (Oracle 提供)
GTC セッション:
企業を加速: 次世代 AI デプロイを実現するツールとテクニック
GTC セッション:
NVIDIA NeMo による多様な言語での基盤となる大規模言語モデルのカスタマイズ
NGC コンテナー:
Phind-CodeLlama-34B-v2-Instruct
NGC コンテナー:
Phi-3-Mini-4K-Instruct
NGC コンテナー:
Mistral-NeMo-Minitron-8B-Instruct