DeepSeek-V2.5-1210

この記事は約15分で読めます。

はじめに

DeepSeek-V2.5-1210は、DeepSeek-V2.5のアップグレードされたバージョンで、様々な能力において改善されています:

数学:MATH-500ベンチマークでのパフォーマンスが74.8%から82.8%に向上しました。 プログラミング:LiveCodebench(08.01 - 12.01)ベンチマークでの精度が29.2%から34.38%に増加しました。 書き出しと推論:内部テストデータセットでは、対応する改善が見られます。 また、新しいモデルバージョンでは、ファイルアップロードとウェブページ要約機能のユーザー体験が最適化されています。

ローカルでの実行方法

BF16形式での推論するためには、DeepSeek-V2.5を利用するには80GB×8のGPUが必要です。

HuggingfaceのTransformersでの推論 HuggingfaceのTransformersを直接モデル推論に活用できます。

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig

model_name = "deepseek-ai/DeepSeek-V2.5-1210"
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
# `max_memory` はデバイスに基づいて設定する必要があります
max_memory = {i: "75GB" for i in range(8)}
# `device_map` を `auto` に設定することはできません
model = AutoModelForCausalLM.from_pretrained(model_name, trust_remote_code=True, device_map="sequential", torch_dtype=torch.bfloat16, max_memory=max_memory, attn_implementation="eager")
model.generation_config = GenerationConfig.from_pretrained(model_name)
model.generation_config.pad_token_id = model.generation_config.eos_token_id

messages = [
    {"role": "user", "content": "C++でクイックソートのコードを書く"}
]
input_tensor = tokenizer.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt")
outputs = model.generate(input_tensor.to(model.device), max_new_tokens=100)

result = tokenizer.decode(outputs[0][input_tensor.shape[1]:], skip_special_tokens=True)
print(result)

チャットテンプレートの詳細は、Huggingfaceモデルリポジトリにあるtokenizer_config.json内で確認できます。

注意:チャットテンプレートは、前のDeepSeek-V2-Chatバージョンと比べて更新されています。

チャットテンプレートの例は以下の通りです:

<|文の始まり|><|ユーザー|>{user_message_1}<|アシスタント|>{assistant_message_1}<|文の終わり|><|ユーザー|>{user_message_2}<|アシスタント|>

オプションのシステムメッセージを追加することもできます:

<|文の始まり|>{system_message}<|ユーザー|>{user_message_1}<|アシスタント|>{assistant_message_1}<|文の終わり|><|ユーザー|>{user_message_2}<|アシスタント|>

vLLMでの推論(推奨) vLLMを使用してモデル推論を行うには、次のPull RequestをvLLMコードベースにマージしてください:https://github.com/vllm-project/vllm/pull/4650.

from transformers import AutoTokenizer
from vllm import LLM, SamplingParams

max_model_len, tp_size = 8192, 8
model_name = "deepseek-ai/DeepSeek-V2.5-1210"
tokenizer = AutoTokenizer.from_pretrained(model_name)
llm = LLM(model=model_name, tensor_parallel_size=tp_size, max_model_len=max_model_len, trust_remote_code=True, enforce_eager=True)
sampling_params = SamplingParams(temperature=0.3, max_tokens=256, stop_token_ids=[tokenizer.eos_token_id])

messages_list = [
    [{"role": "user", "content": "あなたは誰ですか?"}],
    [{"role": "user", "content": "以下の内容を中国語に直接翻訳してください:DeepSeek-V2は経済的で効率的な訓練と推論を保証するために革新的なアーキテクチャを採用しています。"}],
    [{"role": "user", "content": "C++でクイックソートのコードを書く。"}],
]

prompt_token_ids = [tokenizer.apply_chat_template(messages, add_generation_prompt=True) for messages in messages_list]

outputs = llm.generate(prompt_token_ids=prompt_token_ids, sampling_params=sampling_params)

generated_text = [output.outputs[0].text for output in outputs]
print(generated_text)

関数呼び出し 関数呼び出しにより、モデルは外部ツールを呼び出して機能性を強化できます。

以下が例です:

# `model` と `tokenizer` がロードされていると仮定します
model.generation_config = GenerationConfig(do_sample=False, max_new_tokens=128, eos_token_id=tokenizer.eos_token_id, pad_token_id=tokenizer.eos_token_id)

tool_system_prompt = """あなたは役立つアシスタントです。

## ツール

### 関数

以下の関数を使用できます:

- `get_current_weather`:
```json
{
    "name": "get_current_weather",
    "description": "指定された場所の天気を取得します",
    "parameters": {
        "type": "object",
        "properties": {
            "location": {
                "type": "string",
                "description": "都市と州、例:サンフランシスコ、CA"
            },
            "unit": {
                "type": "string",
                "enum": [
                    "celsius",
                    "fahrenheit"
                ]
            }
        },
        "required": [
            "location"
        ]
    }
}
```"""

tool_call_messages = [{"role": "system", "content": tool_system_prompt}, {"role": "user", "content": "東京とパリの天気は怎么样ですか?"}]
tool_call_inputs = tokenizer.apply_chat_template(tool_call_messages, add_generation_prompt=True, return_tensors="pt")
tool_call_outputs = model.generate(tool_call_inputs.to(model.device))
# 生成されたテキスト:'<|ツール呼び出し開始|><|ツール呼び出し開始|>function<|ツール区切り|>get_current_weather\n```json\n{"location": "Tokyo"}\n```<|ツール呼び出し終了|>\n<|ツール呼び出し開始|>function<|ツール区切り|>get_current_weather\n```json\n{"location": "Paris"}\n```<|ツール呼び出し終了|><|ツール呼び出し終了|><|文の終わり|>'

# `get_current_weather` を呼び出したときのモック応答
tool_messages = [{"role": "tool", "content": '{"location": "Tokyo", "temperature": "10", "unit": null}'}, {"role": "tool", "content": '{"location": "Paris", "temperature": "22", "unit": null}'}]
tool_inputs = tokenizer.apply_chat_template(tool_messages, add_generation_prompt=False, return_tensors="pt")[:, 1:]
tool_inputs = torch.cat([tool_call_outputs, tool_inputs.to(model.device)], dim=1)
tool_outputs = model.generate(tool_inputs)
# 生成されたテキスト:東京の現在の天気は10度で、パリでは22度です。<|文の終わり|>

JSON出力 JSON出力モードを使用して、モデルが有効なJSONオブジェクトを生成することを保証できます。このモードをアクティブにするには、システムプロンプトに特別な指示を追加する必要があります。

# `model` と `tokenizer` がロードされていると仮定します
model.generation_config = GenerationConfig(do_sample=False, max_new_tokens=128, eos_token_id=tokenizer.eos_token_id, pad_token_id=tokenizer.eos_token_id)

user_system_prompt = 'ユーザーが試験テキストを提供します。"質問"と"回答"を解析し、JSON形式で出力してください。'
json_system_prompt = f"""{user_system_prompt}

## 応答形式

JSONオブジェクトのみで応答します。"""

json_messages = [{"role": "system", "content": json_system_prompt}, {"role": "user", "content": "世界で一番高い山は哪一个ですか?マウント・エベレストです。"}]
json_inputs = tokenizer.apply_chat_template(json_messages, add_generation_prompt=True, return_tensors="pt")
json_outputs = model.generate(json_inputs.to(model.device))
# 生成されたテキスト:'```json\n{{\n  "question": "世界で一番高い山は哪一个ですか?",\n  "answer":
 "マウント・エベレストです。"\n}}\n```<|文の終わり|>'

FIM補完 FIM(Fill In the Middle)補完では、プレフィックスとオプションのサフィックスを提供し、モデルが中間の内容を補完します。

# `model` と `tokenizer` がロードされていると仮定します
model.generation_config = GenerationConfig(do_sample=False, max_new_tokens=128, eos_token_id=tokenizer.eos_token_id, pad_token_id=tokenizer.eos_token_id)

prefix = """def quick_sort(arr):\n    if len(arr) <= 1:\n        return arr\n    pivot = arr[0]\n    left = []\n    right = []\n"""

suffix = """
        if arr[i] < pivot:\n            left.append(arr[i])\n        else:\n            right.append(arr[i])\n    return quick_sort(left) + [pivot] + quick_sort(right)"""

fim_prompt = f"<|fim begin|>{prefix}<|fim hole|>{suffix}<|fim end|>"
fim_inputs = tokenizer(fim_prompt, add_special_tokens=True, return_tensors="pt").input_ids
fim_outputs = model.generate(fim_inputs.to(model.device))
# 生成されたテキスト:"    for i in range(1, len(arr)):<|文の終わり|>"

ライセンス

このコードリポジトリはMITライセンスに基づいています。DeepSeek-V2ベース/チャットモデルの使用は、モデルライセンスに従ってください。DeepSeek-V2シリーズ(ベースとチャットを含む)は商用利用をサポートしています。

引用

@misc{deepseekv2, title={DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model}, author={DeepSeek-AI}, year={2024}, eprint={2405.04434}, archivePrefix={arXiv}, primaryClass={cs.CL} }

連絡先

質問があれば、イシューを作成するか、service@deepseek.comまでお問い合わせください。

aiスピーキング

ドルフィンAIは言語学習アプリケーションのためのプロフェッショナルな発音評価API(pronunciation assessment api)ソリューションを提供します。音素、単語、文章、チャプター、発音矯正、単語矯正、クイズ、フリーダイアログ、多肢選択問題など幅広く提供しています。当社の発音評価製品(pronunciation assessment)は、英語と中国語、クラウドAPI、オンプレミス、オフラインデバイスの展開をサポートしています。当社の発音評価API(pronunciation assessment api)は、正確性、流暢性、完全性、リズムの次元をカバーする豊富な評価指標を提供し、音素、単語、文の異なるレベルの評価スコアも提供します。また、音素、単語、文の異なるレベルでの評価スコアも提供します。数千万人のユーザーに安定した効率的で安全なサービスを提供しています。ドルフィンAIの発音評価製品(pronunciation assessment)を試してみませんか?

タイトルとURLをコピーしました