TensorRT-LLMをセットアップしてみた

TensorRT-LLMの[公式ドキュメント](https://nvidia.github.io/TensorRT-LLM/quick-start-guide.html)で、落とし穴が多すぎるため、解説を残しておきます。

### TensorRTとは
深層学習の推論を高速、低メモリ容量でできるように最適化したソフトウェアです。訓練などの機能を削ぎ落とし、推論だけに特化したソフトウェアです。

### TensorRT-LLMとは
TensorRTをLLM (Large Language Model)向けに、使いやすいようにしたパッケージです。既に訓練されたLLMをダウンロードすれば使えるように仕立ててあります。

### TensorRT-LLMをセットアップすると何がいいのか
GeForce GPU (1080Ti以降?)を使ってLLMを回すことができます。
自宅のPCで最先端のLLMをいじることができます。

# 準備
今回は以下の環境を使いました。今日現在で全て最新版にアップデードしました。CUDAやDockerなどのインストール／アップデートの方法は各自調べてください。

### 環境
Ubuntu 22.04.4 LTS
GeForce RTX 4090
CUDA Version: 12.4
Docker 26.1.1
NVIDIA Container Toolkit 1.15.0

### Hugging Face
Hugging Faceのアカウントを登録し、write権限のあるtokenを[作成](https://huggingface.co/docs/hub/en/security-tokens)します。
今回使うモデル[Llama-2-7b-chat-hf](https://huggingface.co/meta-llama/Llama-2-7b-chat-hf)の利用権限を申請します。未申請ならFiles and versionsのタブで申請できます。承認されるとGitHubのようにファイル一覧が見えます。

# セットアップ開始
まずは、公式の[Installing on Linux](https://nvidia.github.io/TensorRT-LLM/installation/linux.html#installing-on-linux)に沿って全コマンドを実行していきます。~~このページに落とし穴はありませんでした。~~

調べればすぐ解決できる落とし穴が一つありましたが、一応書いておきます。
一番最後のコマンド`git lfs install`で、
```
git: 'lfs' is not a git command. See 'git --help'.

The most similar command is
	log
```
のエラーになり、インストールできないかもしれません。その場合は以下の方法でインストールできます。

```
apt install curl
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash
apt-get install git-lfs
git lfs install
```



### 落とし穴1
上記の公式instructionの全コマンド実行し終わる頃、あなたはDockerコンテナの中にいるはずです。


:::note alert
**ここでコンテナを出てはいけません！**
出るとコンテナが消えて上記の操作を再度繰り返すことになります。
:::

:::note info
もう一つターミナルを開いてこのコンテナをdocker imageとして保存（commit）します。

**必ずrepositoryとtagを `tensorrt_llm/release:latest` としてcommitしてください！**

```docker commit <コンテナ名> tensorrt_llm/release:latest```
:::

もし、別ターミナルが開けない場合は、Ctrl. + P -> Ctrl. + Q でコンテナを終了せずにディタッチしてdocker imageをコミットできます。

commitが完了したら、出来たdocker imageを確認してみましょう。
`docker images`

```
REPOSITORY             TAG       IMAGE ID       CREATED         SIZE
tensorrt_llm/release   latest    6afa6e80a1e8   8 minutes ago   24.8GB
```

確認できたら、上のコンテナを終了して構いません。

さて、ここまで出来たら公式の[Quick Start Guide](https://nvidia.github.io/TensorRT-LLM/quick-start-guide.html#retrieve-the-model-weights)に行きます。

1. 指示通りHugging Faceのリポジトリをクローンします。(SSHは使わずHTTPSで)
`git clone https://huggingface.co/meta-llama/Llama-2-7b-chat-hf`
[上](#hugging-face)で作成したアカウント名と書き込み権限のあるtokenを入力します。

2. [TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM.git)もう一度（今度はコンテナの外に）クローンします。
`git clone https://github.com/NVIDIA/TensorRT-LLM.git`

3. TensorRT-LLMのフォルダに入り、下記コマンドを実行します。
`make -C docker release_run LOCAL_USER=1`
この操作でdocker imageが作られ、自動的にコンテナが起動します。
[落とし穴1](#落とし穴1)でdocker imageの名前を正しく保存しないとここでエラーになります。

4. コンテナ内で下記コマンドを実行します。上に同じく書き込み権限のあるtokenを入力します。
`huggingface-cli login --token *****`


### 落とし穴2

:::note alert
ディレクトリが違います！
コンテナが起動し、最初にいるworkdirは`/app/tensorrt_llm`はHugging Faceリポジトリとリンクしていません。Hugging Faceリポジトリとリンクしているのは`/code/tensorrt_llm`です。
:::

:::note info
正しいディレクトリに移動します。
```cd　/code/tensorrt_llm/exammples/llama```
:::    

4.あとは、公式の指示に従ってモデルをTensorRTLLMのフォーマットに変換します。
```
python3 convert_checkpoint.py --model_dir meta-llama/Llama-2-7b-chat-hf --output_dir llama-2-7b-ckpt
```

5.モデルをコンパイルします。
```
trtllm-build --checkpoint_dir llama-2-7b-ckpt \
    --gemm_plugin float16 \
    --output_dir ./llama-2-7b-engine
```

これで、セットアップが完了しました！

# LLMを走らせてみよう

```
python3 ../run.py --engine_dir ./llama-2-7b-engine  --max_output_len 100 --tokenizer_dir meta-llama/Llama-2-7b-chat-hf --input_text "How do I count to nine in French?"
```

出力結果👇🏻

```
Input [Text 0]: "
 How do I count to nine in French?"
Output [Text 0 Beam 0]: "

In French, the numbers from 1 to 9 are:

1 - un
2 - deux
3 - trois
4 - quatre
5 - cinq
6 - six
7 - sept
8 - huit
9 - neuf

So, to count to nine in French, you would say:

un, deux, trois, quatre, cinq, six, sept, huit, neuf."
```