DeepSeek-V3は、671B(6710億)パラメータを有する世界最大規模のオープン大規模言語モデル(LLM)です。
その性能はGPT-4oに匹敵すると言われていますが、実際にDeepSeek-V3を動作させるためには、最低でもA100 80GBx8マシンが二台必要になります。うちの社長が二台必要というわけです。いきなり社長をもう一台増やすのは入手性から考えて現実的ではないので、何とか動かせないものかと思っていたのですが、最近発表された、日本語に特化したDeepSeek-V3-Slice-jp64なら337GBなので、うちの社長、AIスーパーコンピュータ継之助(VRAM640GB)でも軽々動かせるはずなので、早速試してみました。
モデルはHuggingFaceにて公開されています。
実際に動作させるのは、PythonのREPL環境で行いました。
>>> import torch
>>> from transformers import AutoModelForCausalLM, AutoTokenizer
>>> model_dir_name = "mmnga/DeepSeek-V3-slice-jp64"
>>> model = AutoModelForCausalLM.from_pretrained(
... model_dir_name,
... torch_dtype=torch.bfloat16,
... trust_remote_code=True,
... device_map="auto")
ちょっとローディングは略します。
>>> tokenizer = AutoTokenizer.from_pretrained(
... model_dir_name,
... trust_remote_code=True,
... )
>>> questions = [
... "quaternionについて説明してください",
... "F=maのそれぞれの変数をquaternionだと仮定した時にこれまでの常識と異なる結果が得られるとしたらどんなことか予想しなさい",
... "量子生物学を使ったSF小説のアイデアを10個考えなさい"]
>>> for prompt in questions:
... messages = [
... {
... "role": "system",
... "content": "全て日本語で返してください。"
... },
... {
... "role": "user",
... "content": prompt
... }
... ]
... # apply_chat_templateを使用してプロンプトを生成
... prompt = tokenizer.apply_chat_template(
... messages,
... tokenize=False,
... add_generation_prompt=True
... )
... inputs = tokenizer(prompt, return_tensors="pt")
... start_time = time.time()
... print("計測開始 ------------------------------")
... print(f"prompt: {prompt}")
... print(f"CALCULATE_START:--------------------------------")
... outputs = model.generate(
... inputs.input_ids,
... max_length=256,
... pad_token_id=tokenizer.eos_token_id
... )
... print(f"CALCULATE_END:--------------------------------")
... print("TEXT_START:--------------------------------")
... print(tokenizer.decode(outputs[0], skip_special_tokens=True))
... print("TEXT_END:--------------------------------")
... end_time = time.time()
... print("")
... print("計測終了 ------------------------------")
... print(f"処理時間: {end_time - start_time:.2f}秒")
...
計測開始 ------------------------------
prompt: <|begin▁of▁sentence|>全て日本語で返してください。<|User|>quaternionについて説明してください<|Assistant|>
CALCULATE_START:--------------------------------
The attention mask is not set and cannot be inferred from input because pad token is same as eos token. As a consequence, you may observe unexpected behavior. Please pass
your input's `attention_mask` to obtain reliable results.
/home/shi3z/.pyenv/versions/anaconda3-2023.09-0/envs/vllm/lib/python3.10/site-packages/transformers/generation/utils.py:2097: UserWarning: You are calling .generate() with
the `input_ids` being on a device type different than your model's device. `input_ids` is on cpu, whereas the model is on cuda. You may experience unexpected behaviors or
slower generation. Please make sure that you have put `input_ids` to the correct device by calling for example input_ids = input_ids.to('cuda') before running `.generate(
)`.
warnings.warn(
The `seen_tokens` attribute is deprecated and will be removed in v4.41. Use the `cache_position` model input instead.
`get_max_cache()` is deprecated for all Cache classes. Use `get_max_cache_shape()` instead. Calling `get_max_cache()` will raise error from v4.48
CALCULATE_END:--------------------------------
TEXT_START:--------------------------------
全て日本語で返してください。<|User|>quaternionについて説明してください<|Assistant|>クオーターンション(Quaternion)は、数学的および物理的な概念で、主に量子力学や信号処
理、画像処理などの分野で使用される数学的なツールや手法の一つです。以下に、クオーターンションの基本的な説明をいくつかのポイントに分けて説明します。
### 1. **定義と概要**
- クオーターンションは、主に連続的なデータや信号を離散的な形で表現し、処理するための数学的な手法です。
- 特に、時間や周波数、その他の連続的なデータを離散化し、効率的に処理するために用いられます。
### 2. **主な使用分野**
- **量子力学**: 量子状態を離散的に表現し、計算やシミュレーションを行う際に利用されます。
- **信号処理**: 音声や画像などの連続的な信号を離散化し、効率的に処理するために使用されます。
- **画像処理**: 画像データを離散的な形で表現し、圧縮やノイズ除去などの処理
TEXT_END:--------------------------------
計測終了 ------------------------------
処理時間: 36.38秒
計測開始 ------------------------------
prompt: <|begin▁of▁sentence|>全て日本語で返してください。<|User|>F=maのそれぞれの変数をquaternionだと仮定した時にこれまでの常識と異なる結果が得られるとしたらどんなこと
か予想しなさい<|Assistant|>
CALCULATE_START:--------------------------------
CALCULATE_END:--------------------------------
TEXT_START:--------------------------------
全て日本語で返してください。<|User|>F=maのそれぞれの変数をquaternionだと仮定した時にこれまでの常識と異なる結果が得られるとしたらどんなことか予想しなさい<|Assistant|>##
# 1. 数学的モデリングの複雑化
**常識との違い:** 通常、数学的モデリングでは実数値が使われることが多いが、F=maの変数をquaternion(4次元)と仮定すると、モデルの複雑性が増す。
**予想される結果:**
- **計算コストの増加:** 4次元のデータを扱うため、計算リソースがより多く必要になる。
- **アルゴリズムの再設計:** 既存のアルゴリズムでは対応しきれないため、新たなアルゴリズムの開発や既存のアルゴリズムの再設計が必要になる。
### 2. データ処理の効率化
**常識との違い:** データ処理では、実数値が使われることが一般的で、quaternionを使うとデータ処理の効率が変わる。
**予想される結果:**
- **データ
TEXT_END:--------------------------------
計測終了 ------------------------------
処理時間: 22.25秒
計測開始 ------------------------------
prompt: <|begin▁of▁sentence|>全て日本語で返してください。<|User|>量子生物学を使ったSF小説のアイデアを10個考えなさい<|Assistant|>
CALCULATE_START:--------------------------------
CALCULATE_END:--------------------------------
TEXT_START:--------------------------------
全て日本語で返してください。<|User|>量子生物学を使ったSF小説のアイデアを10個考えなさい<|Assistant|>以下に、量子生物学をテーマにしたSF小説のアイデアを10個挙げます。
1. **「量子生命の目覚め」**
惑星に移住した人類が、量子生物学を駆使して新しい生命体を誕生させる物語。量子テレポーテーションを利用して、意識を持った生命が生まれる瞬間を描く。
2. **「量子意識の交信」**
異なる惑星に住む生命体同士が、量子テレポーテーションで意識を交信し合い、新しい文化を生み出す物語。意識の交信がもたらす奇跡の物語。
3. **「量子生命の進化」**
惑星で進化を遂げた生命体が、量子生物学を駆使して自らの意識を進化させていく物語。生命の進化がもたらす新たな可能性を描く。
4. **「量子生命の調和」**
異なる惑星に住む
TEXT_END:--------------------------------
計測終了 ------------------------------
処理時間: 24.23秒
GPT-4oに比べると、少し回答が物足りない気がしました。
多分元のExpertsの抽出が、「日本語に反応するExperts」に限定されているからかもしれません。
例えば、最初のquaternionに関する答えは読み方も含めて完全に間違っています。 試しに本家DeepSeekV3に聞いてみるとかなり正しい答えが返ってきました。
(DeepSeekV3はこちらから試すことができます https://www.deepseekv3.com/ja/chat)
なので、日本語の知識を優先して、数学の知識が抜け落ちてしまっているのかもしれません。
ちなみにollamaには4bit量子化されたDeepSeekV3があるので、同じ質問をぶつけてみます。MacBookPro M2の32GB版を使いました。
>>> quaternionについて説明してください
quaternion(四重角度) は、3 次空間の向きを表す数学的概念です。この概念は、3D 座標を使用するだけでなく、4 次元の向きを表現できるため、高い精度と柔軟性を提供します。
**ベクトルと軸**
_quaternion_ は 2 つのベクトルの間の角度を表すもので、これら 2 つのベクトルは 3 次空間内の点を定義するものです。この角度を _quaternion_ と呼びます。たとえば、2 つのベ
クトル `a` と `b` を持つ点 P を考えると、P の位置ベクトルは次のように表すことができます。
`P = a + λ(b - a)`
ここで、λ(lambda)は角度を表します。この式では、_quaternion_ はベクトルの間の角度を表し、これが 3 次空間内の点の位置を定義するものです。
**四重角度の基本的な特性**
_quaternion_ の基本的な特性は次のとおりです。
1. **乗算演算**: _quaternion_ を他の _quaternion_ と乗算すると、ベクトルの間の角度が変化するものを得ることができます。具体的には、2 つの _quaternion_ `q1` と `q2` を乗
算すると、次の式が得られます。
`q1 \* q2 = cos(θ) \* I + sin(θ) \* J + sin(θ) \* K`
ここで、θはベクトルの間の角度です。_quaternion_ の乗算はベクトルとの交差を表すものに変換されます。
1. **逆数**: _quaternion_ の逆数は存在しませんが、正しいベクトルと誤った角度を持つ _quaternion_ を掛け合わせると、その角度に近い_ quaternion_ が得られます。
2. **乗算の特性**: _quaternion_ を 3 つの部位に分割すると、次の特性が得られます。
`q1 \* (I + J + K) = q1`
ここで、I、J、K はベクトルを表すものです。この特性により、_quaternion_ の乗算はベクトルと角度を表すことができます。
**四重角度の用途**
_quaternion_ を使用する用途には次のことが挙げられます。
1. **3D モデリング**: _quaternion_ を使用して 3D 座標を表現し、変化する角度に対応するモーションキャプチャシステムを作成できます。
2. **ローカルオリエントेशन**: _quaternion_ を使用してベクトルの間の角度を表現し、さまざまなアプリケーションのローカルオリエンテーションを実行することができます。
3. **モデリングとシミュレーション**: _quaternion_ を使用して 3D オブジェクトの動きをモデル化し、シミュレーションを実行することができます。
このようなアプリケーションの場合、_quaternion_ を使用すると、変化する角度に対応するモーションキャプチャシステムを作成でき、3D オブジェクトの動きをモデル化し、シミュレ
ーションを実行できるようになります。
やはり正しい説明ができています。
DeepSeekV3は256のエキスパートを持っているそうですが、どのエキスパートを残すべきかは、言語はもちろん、自分の欲しい問題の答えを持っているエキスパートを優先すべきなのかもしれません。
継之助のVRAMにはまだ余裕があるので、64のエキスパートと言わず、さらに追加で30くらいの数学やプログラミングに強いエキスパートを抽出するのも面白いかもしれません。
ただ、それを行うにはA100x8x2か、H200x8が必要なので、ABCIにH100x8環境が整備されるまで待つしかないかもしれません。
MoE(Mixture of Experts)モデルから必要なものだけを抜き出して再パッケージングするという発想は大変面白いと思いました。