皆さんこんにちは、宮川です。ローカルLLM 100日チャレンジ、早くも4日目を迎えました。
昨日はローカルマシン(GPUなし)で、FlaskとStreamlitを使ってチャットボットを動かすことに挑戦しました。その結果、応答速度が課題であることが浮き彫りになりました。
【昨日の気づきより抜粋】 どちらのアプリでも、ローカルマシン(GPUなし)での応答時間は、プロンプトにもよりますが8秒から、長いと25秒以上かかりました。これは、対話としてはかなり厳しい速度です…。原因はやはりCPUでの推論処理と、もしかしたらRAMのスワップなども影響しているかもしれません。 …(中略)…応答速度が遅いため、最適なパラメータを見つけるための試行錯誤に時間がかかりすぎてしまい、ローカル環境でのチューニングは現実的ではないと感じました。
https://miyakawai.com/2025/05/02/003llama3-8b-youko/
ローカルLLMの壁: 高性能GPUなしで大規模モデルを快適に動かすのは難しい。理論と実体験で痛感。
この「ローカルLLMの壁」を体感した上で、今日の目標は**「Google Colabの高性能GPUを使えば、応答速度はどれだけ改善されるのか?」**を確かめることでした。
いざ、Colab Pro (A100 GPU) の世界へ!
幸いにも私はColab Proを利用できる環境にあったため、強力なA100 GPUを使ってみることに。モデルは昨日と同じく、日本語に特化しているとされる rinna/llama-3-youko-8b
を選択。昨日作成したFlaskアプリケーションのコードをベースに、Colab上で動かす準備を始めました。
立ちはだかった「環境構築」という名の壁
しかし、意気揚々と始めたのも束の間、早速Colab環境特有の洗礼を受けることになりました。ローカルではすんなり動いたコードが、Colabではライブラリの依存関係エラーで動かないのです。
torchvision
という画像系ライブラリの初期化エラーに始まり、Colabにプリインストールされている sentence-transformers
とバージョンが衝突したり、しまいにはトークナイザーのファイル (tokenizer.json
) が壊れているのでは?と疑うようなエラー (data did not match any variant...
) まで発生…。
解決のために、何度もランタイムを再起動し、ライブラリのバージョンを細かく指定し直し、Google Drive上のキャッシュを削除して再ダウンロードを強制する、といった泥臭い作業が必要でした。AIアシスタント(Gemini)に何度も助けを求めながら、なんとかエラーを一つずつ潰していく作業は、なかなかに骨が折れました。
ここで得た大きな学びは、**「Google ColabでFlaskを使って(外部ライブラリ多めの)対話モデルを作るのは、ライブラリの依存関係の解決が思った以上に難しい」**ということでした。ローカル環境とは違う考慮が必要ですね。
ついに動作!そして驚きの応答速度!
数々のエラーとの格闘の末、ついにColab上でFlaskアプリが起動! ngrokで生成されたURLにアクセスすると、昨日と同じチャットインターフェースが表示されました。感無量です。
そして、肝心の応答速度は… 劇的に改善されました!
昨日、ローカルマシンで8秒~25秒以上かかっていた応答が、Colab (A100) ではわずか数秒、長くても5秒程度で返ってくるではありませんか! 「こんにちは」のような簡単な挨拶でも、具体的な質問でも、ほぼ待たされる感覚なく対話が進みます。
まさに桁違いのスピードアップ。高性能GPUが大規模言語モデルの推論に与える影響の大きさを、身をもって体験することができました。昨日の「ローカルLLMの壁」を痛感した後だけに、この速度は感動的です。今日の目的は、完全に達成できました!
見えてきた新たな課題:モデル固有の「クセ」
しかし、手放しで喜んでばかりもいられませんでした。応答速度は解決したものの、今度はモデル rinna/llama-3-youko-8b
の応答品質に、かなり**「クセ」**があることが見えてきたのです。
- 「日本の首都は?」→「東京都です。」(素晴らしい!)
- 「日本で一番高い山は?」→「富士山です。」(完璧!)
このように具体的な質問には的確に答えてくれるのですが…
- 「こんにちは」→ 突然「助手のイカちゃんです」とロールプレイを始め、大量の外国語リストを延々と話し出す。
- (↑を受けて)「いろんな言語があるんですね」→ 意味不明なブログの編集ログのようなテキストを繰り返し生成。
- 「福井県、石川県、富山県の県庁所在地名を教えてください。」→ 「…いますぐ回答を!」と、なぜか回答を拒否するような定型句を返す。
など、文脈に合わない応答や、不安定な挙動が目立ちました。昨日ローカルで感じた「話が噛み合わない」問題は、速度が上がっても解決したわけではなく、むしろ高速な環境で試行錯誤する中で、モデル自体の特性としてよりはっきりと認識されました。
Flask側で生成パラメータ(temperature
, repetition_penalty
)を調整してみましたが、応答の繰り返しは抑制できても、今度は全く関係のない話題(為替レートの話など)を生成し始めたりと、安定させるのが難しい印象です。高速な環境でも、モデルのチューニングは一筋縄ではいかないようです。
Day 4 のまとめと次への展望
今日の挑戦で得られた学びは大きかったです。
- GPUは偉大: 理屈では分かっていましたが、高性能GPUによるLLMの速度向上効果は絶大でした。快適な対話のためには、やはり相応のマシンパワーが重要です。
- 環境構築の落とし穴: Colabのような共有環境では、ライブラリの依存関係が思わぬところで問題になることがあります。エラー解決能力も試されますね。
- モデル選びの重要性: 応答速度だけでなく、モデルごとの応答の質、安定性、そして「クセ」を見極めることが重要だと感じました。
今回の rinna/llama-3-youko-8b
は、特定の知識は持っていても、自由な対話には少し不安定な面があるのかもしれません(あくまで私の環境での感想です)。
Google Colab で利用したコードはGitHubで確認できます。
https://github.com/miyakawa2449/100day/tree/main/004_llama3_8b_Youko_Colab
そこで、次回(Day 5)は、より「クセ」が少なく、標準的と言われるような他の日本語モデル(ELYZAさんのモデルやStability AIさんのモデルなど)を試してみたいと思います。また、今回のチャットボットは会話の履歴を記憶していないため、文脈を理解した対話ができませんでした。会話履歴を保持する機能の実装にも、いずれ挑戦してみたいですね。
100日チャレンジはまだ始まったばかり。試行錯誤も多いですが、一つ一つ学びながら進めていく過程を楽しんでいきたいと思います。
それでは、また明日! 宮川