[C++] 386 ChatAIアプリの製作 その55 DeepSeek日本語量子化GGUFファイルの検証 llama.cpp

[Mac M2 Pro 12CPU RAM 16GB, Sonoma 14.7.1, clang++ 16.0.0]
GGUF: cyberagent-DeepSeek-R1-Distill-Qwen-14B-Japanese-Q5_K_M.gguf 10.5GB

DeepSeek日本語版をサイバーエージェントが公開したので、量子化ファイルを動作検証しました。

前回記事のGGUFと同様に時間はかかりますが、コード提案能力はなかなかのものです。これまで量子化するとかなり能力が落ちるという印象でしたが、DeepSeekではそのようなことはありませんでした。蒸留が効いているのでしょうか。

プログラミング用途ではgpt-4oやPerplexityからこちらに移行します。

ローカルLLMをまともに動かすにはユニファイドメモリ 64GB以上が必要、という認識が見事に覆りました。最新GGUFはRAM 16GBで使用に耐えるレベルにて動作します。

VRAM 12GBのWindowsPCではどうなるか検証してみたいです。

 [C++] 385 ChatAIアプリの製作 その54 DeepSeek量子化GGUFファイルの検証 llama.cpp

[Mac M2 Pro 12CPU RAM 16GB, Sonoma 14.7.1, clang++ 16.0.0]
GGUF: DeepSeek-R1-Distill-Llama-8B-Q4_K_M.gguf 4.9GB

話題のDeepSeekを量子化ファイルで試してみました。

プログラミング用途ではこれまで扱ってきたGGUFと比べてかなり優秀です。gpt-4oと比べると回答内容はまずまず、レスポンス時間はかなり長いです。

DeepSeekチャットサーバ起動コマンド

cd /AI/llama.cpp && ./bin/llama-server -m models/DeepSeek-R1-Distill-Llama-8B-Q4_K_M.gguf -ngl 1 -c 4096

 [C++] 384 ChatAIアプリの製作 その53 推論モデルo3-miniの導入

[Mac M2 Pro 12CPU, Sonoma 14.7.1, clang++ 16.0.0]
[C++] 383は非公開

普段はgpt-4oで十分足りていますが、評判がいいようなのでo3-miniも使えるようにしました。temperatureを削除して、reasoning_effortを追加しています。

if(countQ == 0 && load == false){
    cout << "question1回目\n" << question << endl;
    cout << "model: \n" << model.c_str() << endl;

    if (model.find("gpt") != string::npos){
        // gpt-4
        requestData = "{\"model\":\"" + model + "\", \"messages\":[{\"role\":\"system\",\"content\":\"" + systemStr + "\"},{\"role\":\"user\",\"content\":\"" + question + "\"}], \"temperature\":0.0}";
    } else if (model.find("mini") != string::npos){
        // o3-mini
        requestData = "{\"model\":\"" + model + "\", \"messages\":[{\"role\":\"system\",\"content\":\"" + systemStr + "\"},{\"role\":\"user\",\"content\":\"" + question + "\"}], \"reasoning_effort\":\"medium\"}";
    } else if (model.find("llama.cpp") != string::npos){
        // llama.cpp
        requestData = "{\"model\":\"" + model + "\", \"messages\":[{\"role\":\"system\",\"content\":\"" + systemStr + "\"},{\"role\":\"user\",\"content\":\"" + question + "\"}], \"temperature\":0.0}";
    } else if (model.find("sonar") != string::npos){
        // perplexity
        requestData = "{\"model\":\"" + model + "\", \"messages\":[{\"role\":\"system\",\"content\":\"" + systemStr + "\"},{\"role\":\"user\",\"content\":\"" + question + "\\n日本語で回答してください。" + "\"}], \"temperature\":0.0}";
    }