昨日発表されたInternLMは、7Bというサイズにも関わらず、100万トークンという長大なコンテキストウィンドウをサポートしたオープンソースライセンスのLLMです。ソースコードはApacheライセンスで、モデルは申請すれば商用利用も可能とされています。
ただし、100万トークンを実行するにはA100 80GBx4が最低限必要ということで当社の社長である継之助(AIスーパーコンピュータ)に実行してもらうことにしました。
いきなり実行するとエラーが出たので、まずはLMdeployというツールをDockerを使ってインストールします。
$ export LMDEPLOY_VERSION=0.5.0
$ export PYTHON_VERSION=38
$ pip install https://github.com/InternLM/lmdeploy/releases/download/v${LMDEPLOY_VERSION}/lmdeploy-${LMDEPLOY_VERSION}+cu118-cp${PYTHON_VERSION}-cp${PYTHON_VERSION}-manylinux2014_x86_64.whl --extra-index-url https://download.pytorch.org/whl/cu118
ここではCUDA11.8とPython3.8を使っています。
インストールには30分ほどかかりました。
このあと、PythonのREPLで実行してみます
>>> from lmdeploy import pipeline, GenerationConfig, TurbomindEngineConfig
>>> backend_config = TurbomindEngineConfig(
rope_scaling_factor=2.5,
session_len=1048576, # 1M context length
max_batch_size=1,
cache_max_entry_count=0.7,
tp=4) # 4xA100-80G.
>>> pipe = pipeline('internlm/internlm2_5-7b-chat-1m', backend_config=backend_config)
>>> prompt = 'Use a long prompt to replace this sentence'
>>> pipe(prompt)
すると、以下のように返ってきました。
Response(text='Sure, here\'s a long prompt that can replace the sentence: "I\'m sorry, but I am unable to provide assistance with that request. Please refrain from making inappropriate or offensive inquiries in the future. If you have any other questions or concerns that you need assistance with, feel free to ask and I will do my best to help you."', generate_token_len=69, input_token_len=110, session_id=0, finish_reason='stop', token_ids=[39584, 328, 1734, 725, 395, 1439, 10069, 560, 777, 8422, 410, 11802, 334, 461, 295, 2940, 14722, 328, 847, 489, 1221, 12039, 442, 3572, 13141, 579, 560, 1831, 281, 5368, 56352, 635, 3422, 32805, 607, 15307, 43469, 435, 410, 4008, 281, 1562, 629, 746, 1030, 1148, 4917, 607, 10659, 560, 629, 1329, 13141, 579, 328, 2828, 2060, 442, 2705, 454, 489, 818, 784, 983, 1999, 442, 1638, 629, 1334], logprobs=None)
ちゃんと動いているようです。
では、まず日本語で聞いてみます。
>>> pipe("富士山の高さは?")
Response(text='富士山の高さは、山頂から山脚まで約3,776.24メートルです。これは、山頂に登る人々が目指す高さです。富士山は、日本で最も有名な活火山で、世界の登山者たちの心に在ります。', generate_token_len=76, input_token_len=109, session_id=0, finish_reason='stop', token_ids=[79525, 60631, 62984, 60436, 64336, 64124, 60359, 60631, 63354, 63699, 64154, 60631, 61342, 63960, 64352, 61841, 308, 328, 23283, 281, 1311, 65341, 63129, 64225, 63985, 64352, 64484, 60355, 64229, 64508, 64124, 60359, 60631, 63354, 63871, 61081, 63857, 60364, 67182, 64232, 60576, 60739, 64484, 60436, 64336, 64352, 64484, 60355, 79525, 60631, 64124, 60359, 68486, 64352, 60442, 64373, 84561, 63613, 60571, 73653, 64352, 60359, 68339, 62984, 80671, 60497, 63653, 64599, 62984, 60447, 63871, 60361, 64057, 63960, 64484, 60355], logprobs=None)
日本語が普通に使えて感動さえ覚えます。
HuggigFaceのデフォルトでは1Mコンテキストは長すぎて扱えないのでLMdeployを使う必要があるようです。
では本当に長い文章を読むことができるか、筆者の昔のブログの記事の一部を読ませて要約させてみます。
>>> prompt='''以下の文章を日本語で要約せよ
学校の三角関数は教え方が悪い
どこぞの首長が『女子に三角関数を教えて何になる」という、暴言としか思えないことを言ったとか言わないとか撤回したとかで一悶着ありました
まあ当の首長は男性だけど三角関数使ったことあるのかどうかは甚だ疑問です
むしろ彼にこそ必要なかったのでは? と思ったりします。
(中略)
そんなこと事前に考えて設計できるのも凄いし、書くのも凄い。売れるのはもっと凄い。実際、そこに至る経緯はハックル先生と加藤さんのどっちがアイデアを出したか知らないけど、やっぱりとにかくすげえなと思った。
僕は基本的に自分の書けることを書きたいように書くことしかできてないから、こんなふうに狙ったマーケットに向けてズバッとストライクを投げ込む、みたいなことは苦手だ。まあきっと構成作家としてのハックル先生の経験が活きたのだろう
個人的にハックル先生は好きではないが、もしドラの素晴らしさは別格である、と思う。'''
>>> pipe(prompt)
大体5000字くらいの文字量です。
この答えはこうなりました。
Response(text='文章の要約:\n\n学校の三角関数の教え方が悪いと述べられています。教科書に書かれた内容を暗記させるより、子供の興味を引き出すことが重要です。三角関数は実用的に使われることが多いですが、その意味がわからない人たちにとって、それは受験ゲームのための緊急避難敵のツールになってしまいます。そのため、自然対数eのiθ乗のような複雑な説明が理解できません。数学の授業がつまらないという問題の解決策は、数学の実用的な使い方や楽しみ方を教えることです。\n\nその他の文章の内容は、「最速の仕事術はプログラマーが知っている」という書籍の第三刷が決定されたことを述べています 書籍の内容は、高校野球を題材にしたラノベで、麻薬的効果を持って読者に感情を揺さぶるような構造になっています。この書籍は100万部売れると予測されています。', generate_token_len=335, input_token_len=4325, session_id=0, finish_reason='stop', token_ids=[68786, 62984, 60371, 61841, 1593, 68413, 62984, 69489, 67024, 60527, 62984, 60570, 64840, 60386, 64232, 68034, 63217, 63847, 61235, 67040, 64154, 64508, 63882, 63217, 63960, 64484, 60355, 78910, 62078, 63871, 62078, 63699, 64508, 63653, 68341, 64340, 61582, 62484, 64336, 65429, 63857, 64854, 64057, 60359, 60401, 60888, 62984, 62587, 60824, 64340, 60949, 64093, 60389, 64484, 64229, 63847, 64232, 68372, 64352, 64484, 60355, 69489, 67024, 60527, 64124, 66937, 68663, 63871, 60534, 65063, 64508, 63857, 64229, 63847, 64232, 60393, 63217, 62984, 64352, 64484, 64232, 60359, 65340, 62984, 70895, 64232, 65063, 63699, 64154, 63613, 63217, 60364, 63653, 64599, 63871, 63847, 64328, 63882, 60359, 65340, 64508, 64124, 60695, 236, 171, 150, 67031, 63129, 65480, 62984, 63653, 65084, 62984, 64313, 61450, 61364, 63372, 64053, 62984, 65984, 63129, 63985, 63871, 63613, 64328, 63882, 63615, 63960, 63217, 63960, 64484, 60355, 65340, 62984, 63653, 65084, 60359, 68519, 67353, 60527, 261, 62984, 266, 66116, 68155, 62984, 64854, 63697, 63613, 63946, 236, 158, 148, 63613, 65986, 60561, 64232, 68865, 64352, 64093, 63960, 65429, 63761, 60355, 69390, 62984, 61354, 61637, 64232, 64489, 63960, 64154, 63613, 63217, 63847, 63217, 63697, 74176, 62984, 90889, 61247, 64124, 60359, 69390, 62984, 66937, 68663, 63613, 60534, 63217, 60386, 64998, 66969, 63615, 64366, 60386, 64340, 60570, 64840, 63857, 64229, 63847, 64352, 64484, 60355, 402, 65340, 62984, 60404, 62984, 68786, 62984, 68341, 64124, 60359, 61125, 60442, 60833, 62984, 63180, 60443, 62426, 64124, 65230, 64596, 65420, 64246, 64812, 63129, 64232, 60538, 64328, 63882, 63217, 63857, 61117, 63847, 63217, 63697, 89931, 62984, 68440, 61289, 64232, 74573, 64336, 64508, 63653, 64229, 63847, 64340, 61235, 67040, 63882, 63217, 63960, 64484, 60355, 89931, 62984, 68341, 64124, 60359, 71085, 61411, 60726, 64340, 62673, 60802, 63871, 63615, 63653, 64246, 65168, 66757, 64352, 60359, 61299, 235, 153, 175, 60354, 232, 141, 188, 60457, 64340, 60687, 64328, 63882, 235, 173, 176, 60497, 63871, 69079, 64340, 233, 146, 189, 64336, 66571, 63857, 64854, 63697, 63613, 79845, 63871, 63613, 64328, 63882, 63217, 63960, 64484, 60355, 64229, 62984, 89931, 64124, 1166, 60775, 60460, 68134, 64508, 63857, 63847, 61759, 63176, 64336, 64508, 63882, 63217, 63960, 64484, 60355], logprobs=None)
いい具合に要約できていると思います。
ちなみに「日本語で」をつけないと中国語で要約されてしまいました。
4つのA100 80GB GPUをそれぞれ62GBずつ使っているようです。
これを使ってMoA(Mixture of Agents)をやったらすごく良さそうな気がしてきました。
FreeAIでは今後も継続的にローカルLLMを追いかけていきたいと思います。