NVIDIA LaunchPadを通してNIMを体感する

## NVIDIA LaunchPad
NVIDA LaunchPadはお手軽にNVIDIA Certified System上で同社のGPU、AIソフトウェア、NIMなどを試すことができるプログラムです。時間は限られますが雰囲気を体感できるのでこれが無料とはありがたい機会です。備忘録としてここに書いていますが宣伝されて困ることはないのかと心配になります。

https://www.nvidia.com/ja-jp/launchpad/

## 試したハンズオンラボ
今回はこのプログラムを通して「5分でLLMをデプロイ！」を試しました。実機環境を確認したり、英語を目を皿にして読んだりしていたので5分では終わりませんでした。とはいえ時間制限で折角の環境が消えてしまうので怠惰な私も終えることができました。

https://www.nvidia.com/en-us/launchpad/ai/generative-ai-inference-with-nim/

## 利用までの流れ
利用は非常に簡単です。使いたいラボを選び、Start Nowで必要事項を埋めていきます。途中メールのVerification Codeを入れるところがありますので、受信メールを確認して入れていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188937/27678e60-c8e1-2e00-d3b5-87cc96072297.png)

その後に利用が承認されると「Congraturation！」と環境にアクセスするURLがメールで届きます。

## インストラクションと環境へのアクセス
メールに貼り付けてあるURLにアクセスしてログインに成功するとWelcome画面が出迎えてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188937/331faaf3-d06d-9f6a-dd3f-2d58f1ab1b5b.png)

さらにGet Startedしますとハンズオンのインストラクションに進みます。もうこのまま読み進めていけば解説してくれながらハンズオンを進めることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188937/968ca526-4bb1-a8ec-4458-822381358b1d.png)

環境へのアクセスにはCode Server IDEを使うか、SSH Setupで鍵を設定して環境に繋ぐこともできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188937/7e69a6ab-3c60-2f9f-87df-cd6b76c3ba00.png)

Code Server IDEは下記のような画面です。真ん中の上側がインストラクション、下にターミナルが開いています。Get Started前のインストラクションに従ってこちらのIDEに流れていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188937/2edd67d3-8e13-9b52-6096-d89da83bcab1.png)

鍵の設定画面はこちらです。SSH Key Genして公開鍵を入れてあげると接続コマンドが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188937/526484f3-810b-1d97-23fb-45fc913ce0f1.png)

Metricsを選ぶとGrafanaのDashboardが出てきてリソース状況を把握できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188937/75662f5d-adee-60c1-1b9f-e0704d10860a.png)

NVIDIA Inference MicroserviceはLLMのモデルエンジン、ランタイム、APIアクセスするためのサーバーで構成されているNIM(NVIDIA Inference Microservices)のコンテナを走らせた後に、モデルとのInteractionのために使っていきます。

User Managementで他のユーザーを呼ぶこともできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188937/30ea497e-b530-0cc5-38b9-fc05c628dc0e.png)

## 払い出された環境
払い出された環境はUbuntuでした。
```
Welcome to Ubuntu 22.04.4 LTS
```
Kubernetesが動いています。
```
$ kubectl version
Client Version: v1.30.6
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.30.6
```
Nodeは1つです。
```
$ kubectl get nodes
NAME              STATUS   ROLES                  AGE   VERSION
try-xxxxx-gpu01   Ready    control-plane,worker   21h   v1.30.6
```
どのようなリソースを使っているのかを見るために```kubectl describe nodes try-xxxxx-gpu01```で中身を見てみました。GPU Operatorが動いています。
```
Non-terminated Pods:          (20 in total)
  Namespace                   Name                                                               CPU Requests  CPU Limits  Memory Requests  Memory Limits  Age
  ---------                   ----                                                               ------------  ----------  ---------------  -------------  ---
  default                     dnsutils                                                           0 (0%)        0 (0%)      0 (0%)           0 (0%)         21h
  k8s-nfs-storage             nfs-subdir-external-provisioner-5cf86bb965-mmzxx                   0 (0%)        0 (0%)      0 (0%)           0 (0%)         21h
  kube-system                 calico-kube-controllers-65dcc554ff-4sfg2                           0 (0%)        0 (0%)      0 (0%)           0 (0%)         21h
  kube-system                 calico-node-tq8m8                                                  250m (0%)     0 (0%)      0 (0%)           0 (0%)         21h
  kube-system                 coredns-55cb58b774-9tswl                                           100m (0%)     0 (0%)      70Mi (0%)        170Mi (0%)     21h
  kube-system                 coredns-55cb58b774-wbcf5                                           100m (0%)     0 (0%)      70Mi (0%)        170Mi (0%)     21h
  kube-system                 etcd-try-57516-gpu01                                               100m (0%)     0 (0%)      100Mi (0%)       0 (0%)         21h
  kube-system                 kube-apiserver-try-57516-gpu01                                     250m (0%)     0 (0%)      0 (0%)           0 (0%)         21h
  kube-system                 kube-controller-manager-try-57516-gpu01                            200m (0%)     0 (0%)      0 (0%)           0 (0%)         21h
  kube-system                 kube-proxy-pc55d                                                   0 (0%)        0 (0%)      0 (0%)           0 (0%)         21h
  kube-system                 kube-scheduler-try-57516-gpu01                                     100m (0%)     0 (0%)      0 (0%)           0 (0%)         21h
  nvidia-gpu-operator         gpu-feature-discovery-tvmd4                                        0 (0%)        0 (0%)      0 (0%)           0 (0%)         21h
  nvidia-gpu-operator         gpu-operator-1738579739-node-feature-discovery-gc-f8657fcb76lkq    10m (0%)      0 (0%)      128Mi (0%)       1Gi (0%)       21h
  nvidia-gpu-operator         gpu-operator-1738579739-node-feature-discovery-master-76bb7v4ls    100m (0%)     0 (0%)      128Mi (0%)       4Gi (0%)       21h
  nvidia-gpu-operator         gpu-operator-1738579739-node-feature-discovery-worker-jcwx7        5m (0%)       0 (0%)      64Mi (0%)        512Mi (0%)     21h
  nvidia-gpu-operator         gpu-operator-bf4cf9db-g6hwg                                        200m (0%)     500m (0%)   100Mi (0%)       350Mi (0%)     21h
  nvidia-gpu-operator         nvidia-dcgm-exporter-gl9dp                                         0 (0%)        0 (0%)      0 (0%)           0 (0%)         21h
  nvidia-gpu-operator         nvidia-device-plugin-daemonset-ntkc7                               0 (0%)        0 (0%)      0 (0%)           0 (0%)         21h
  nvidia-gpu-operator         nvidia-mig-manager-ck6gr                                           0 (0%)        0 (0%)      0 (0%)           0 (0%)         21h
  nvidia-gpu-operator         nvidia-operator-validator-tcdtp                                    0 (0%)        0 (0%)      0 (0%)           0 (0%)         21h
  ```
  割り当てられたリソースは下記のような感じです。
  ```
  Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests    Limits
  --------           --------    ------
  cpu                1415m (0%)  500m (0%)
  memory             660Mi (0%)  6322Mi (0%)
  ephemeral-storage  0 (0%)      0 (0%)
  hugepages-1Gi      0 (0%)      0 (0%)
  hugepages-2Mi      0 (0%)      0 (0%)
  nvidia.com/gpu     0           0
  ```
GPUのアサインも確認します。H100、そしてNVLと書かれていることから高速GPU間接続技術であるNVLinkで接続されていることがわかります。
```
$ nvidia-smi -L
GPU 0: NVIDIA H100 NVL (UUID: GPU-b4eb1ff2-05b9-568b-02c4-448bcda536b0)
GPU 1: NVIDIA H100 NVL (UUID: GPU-4fcfdaf5-9818-0573-6f3b-b6d1af9d55ea)
GPU 2: NVIDIA H100 NVL (UUID: GPU-94db65b2-444b-2551-1894-73b305cc3392)
GPU 3: NVIDIA H100 NVL (UUID: GPU-feb7fdf6-757a-e218-8cff-dd08fa2be886)
GPU 4: NVIDIA H100 NVL (UUID: GPU-fb183662-2555-9fc2-d11e-176f6ad889c3)
GPU 5: NVIDIA H100 NVL (UUID: GPU-b33a9e8f-11d9-903c-072d-f9b718a3a42a)
GPU 6: NVIDIA H100 NVL (UUID: GPU-84fcdaa8-6336-fc31-a14d-a986e442dce2)
GPU 7: NVIDIA H100 NVL (UUID: GPU-b46d098c-c6d0-44ac-4a14-1a83022fa77c)
```
## ハンズオンの実施
ハンズオン自身は手順に従い進めていきます。基本的な流れは下記でした。

### NVIDIA API catalogからAPIキーの発行
[ここ](https://build.nvidia.com/meta/llama3-8b)からllama3-8bのモデルへのAPIキーを生成します。

### ダウンロード済みのコンテナを起動
ご丁寧にコンテナイメージはダウンロード済みです。手順のコマンドをぺちっと打ちます。
```
$ export CONTAINER_NAME=meta-llama3-8b-instruct
docker run -it --rm --name=$CONTAINER_NAME \
    --gpus all \
    -e NGC_API_KEY \
    -v ~/nim-cache:/opt/nim/.cache \
    -p 8000:8000 \
    --shm-size=10.24gb \
    nvcr.io/nim/meta/llama3-8b-instruct:1.0.0

===========================================
== NVIDIA Inference Microservice LLM NIM ==
===========================================

NVIDIA Inference Microservice LLM NIM Version 1.0.0
Model: nim/meta/llama3-8b-instruct

Container image Copyright (c) 2016-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.

This NIM container is governed by the NVIDIA AI Product Agreement here:
https://www.nvidia.com/en-us/data-center/products/nvidia-ai-enterprise/eula/.
A copy of this license can be found under /opt/nim/LICENSE.

The use of this model is governed by the AI Foundation Models Community License
here: https://docs.nvidia.com/ai-foundation-models-community-license.pdf.
```
### LLMとお話し
起動した後はNVIDIA Inference MicroserviceからNotebookを開いて、用意されたコマンドでLLMとお話ししていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188937/214360bc-b379-11d9-6962-f485529879b7.png)

## おわりに
このようにNVIDIA LaunchPadを通して手軽にNVIDIAのテクノロジーに触れることができます。他のラボも試したくなりながらターミナルを閉じ、ラボが使えたことに感謝しつつ、こちらの筆をおくことにします。