はじめに
ハッカソンのきっかけで、ローカルLLMを用いた開発に挑戦することになった。デプロイを考えてDockerコンテナ化もしようとした。
目次
- 初めてのローカルLLM
- Dockerコンテナ内にLLMを実行
1. 初めてのローカルLLM
コマンドラインからオープンソースLLMを実行できるollamaという非常に便利なフレームワークがある。ここからダウンロードできる。以下はmac上での実行例。
インストールした後、コマンドラインに ollama serve
を書くとlocalhost:11434でサーバーが立ち上がったよのログとAPIの色んなHTTPリクエストに関する情報が表示される。以下はHTTPリクエスト一覧の部分。
localhost:11434に行くと「Ollama is running」が表示されて、ちゃんと実行できていることを確認できる。
APIの試しとしてlocalhost:11434/api/versionを打つと、GETリクエストが送られて、バージョンが記載してあるリスポンスが帰ってくる。
これはターミナルにollama --version
を書くことに相当する
実行できていることを確認したので、LLMをインストールしてみよう。Ollamaのモデル一覧から好きなモデルを探してモデル名をコピーする。そしてターミナルにollama pull モデル名
と書いてダウンロードが開始する。ollama list
でダウンロード済みのモデルが確認できる。
ダウンロード終わったあと、ollama run モデル名
でモデルを実行できる。なおインストールされていないモデルを実行しようとすると勝手にダウンロードしてくれるので、すぐに実行したいならollama run モデル名
だけで良い。
今回はGoogleのGemmaの日本語の文章にファインチューニングされたschroneko/gemma-2-2b-jpn-it
を利用することにした。モデルの詳細はこちら。
ターミナルにollama run schroneko/gemma-2-2b-jpn-it
を書くと、Pythonの対話モードのように>>>
の記号が表示されて、対話が開始される。システムプロンプトがすでに設定されているが/set system "お好きなプロンプト"
で再設定できる。他のコマンドはこちら。
これでローカルLLMを実行できた!
これからは対話ができるし、開発しているアプリからHTTPリクエストでモデルを活用できる。PostmanやHTTPieなどで色んなリクエストを試すとよい。だが、リスポンスのjsonの解釈が複雑になってくるのでLangchainの利用をおすすめする。
2. Dockerコンテナ内にLLMを実行してみた
このLLMをアプリに使う目的だったけど、アプリもコンテナ化するつもりで、LLMもコンテナ化しないといけないことになった。ネットに調べたらモデルのファイルが~/.ollama/models
に保存されていることが分かった(macの場合)。けど、そのディレクトリにblobs
とmanifest
というディレクトリがあってモデルのデータそこにわかれているしファイル名がハッシュになっていた。コンテナ起動の際に~/.ollama
の中身丸ごとをコンテナのroot/.ollama
にコピーしてもいい気もしたけど他のモデルも入っていたので重すぎた。
ハッカソン中で時間に追われていたので、普通にDocker Desktopでコンテナのターミナルからollamaとモデルをインストールしちゃった。
そうして普通に実行できたけど、動作が非常に遅かった。対話しようとしたら、LLMの回答がリアルタイムに生成されるはずのに、30秒ごとに一トーケンのペースで出力されていたし、回答が全然間違っていた。
これのせいで実装方法の実用性を考えなおすことになった。ハッカソン中にはさすがにLLMのコンテナ化を諦めたが、今度コンテナのリソースを調整して、再挑戦したいと思っている。
終わりに
Gemmaをファインチューニングしたschronekoさんに感謝