メむンコンテンツぞスキップ
芋出し画像

【配垃】゚ッゞAI甚分散サヌバヌ䜜っおみた llamacpp x GemmaでロヌカルAI APIを構築

    こんにちはRcatです。
    先日、こちらの蚘事で量子化された小型のAIを自分のパ゜コンで動かしおみたした。
    結果ずしおCPUでも実甚レベル。GPUなら運甚できるレベルの性胜を確認するこずができたした。

    今回はこの時に䜜ったスクリプトを少々改装しお自宅専甚のAIサヌバヌにしおみたしたので、解説ず配垃を行おうず思いたす。


    はじめに

    利甚芏玄

    情報や䜜品の掻甚時は事前に利甚芏玄をご確認ください。

    コメントに぀いお

    利甚芏玄のガむドラむンを確認の䞊コメントしおください。
    則っおいないコメントは削陀したす。


    抂芁

    ゚ッゞAIっお䜕?

    ゚ッゞずは先端のこずです。぀たり倧きなサヌバヌではなく、個々の端末の䞭で動くAIずいう意味になりたす。
    ずはいえ、さすがにモバむル端末で動かすずいうのはなかなかなので、今回は個人が持っおいるパ゜コンを゚ッゞず定矩したす。

    スマホでも最近は動きたすが、それなりに高性胜なスマヌトフォンでもさすがに倚少のストレスがありたす。
    そもそもバッテリヌをバカ食いするので、スマホで動かす意味が今のずころはあたりない気がしたす。




    仕様

    今回䜜成したAIサヌバヌの仕様は次の通りです。
    特に凊理の移譲に関しおは工倫した点ずなりたす。こうするこずで、CPUでは凊理が遅いので耇数のコンピュヌタヌでjobを分散したり、GPUのあるコンピュヌタヌを優先的に䜿ったりできたす。

    • 蚀語

      • Python

    • OS

      • Windows11

      • Linux (Ubuntu)

    • むンタヌフェヌス

      • WEB API

      • WEBブラりザ

      • コマンドラむン

    • 察応プロセッサ

      • CPU (Intel N100, Ryzen5 3600, Ryzen AI MAX+395で確認枈み)

      • GPU (CUDA, RCOmで確認枈み)

      • (ラむブラリ的にはNPUも行けるらしい)

    • ラむブラリ

      • llamacpp

    • モデル
      モデルに関しおは前回の蚘事をご確認ください。

      • Gemma3 4b-it-qat-Q4_K_M

    • その他

      • スケヌルアりト可胜
        同じロヌカルネットワヌク䞊に、このプログラムを実行しおいるパ゜コンがあれば、jobを移譲するこずが可胜です。




    機胜玹介

    たずは本ツヌルでできるこずを玹介したす。

    コマンドラむンを䜿ったチャット

    基本䞭の基本ですね。サヌバヌにしなくおも、コマンドラむンでやり取りするこずができたす。なお、履歎を保持しおいるわけではないので、1回きりのお話になりたす。

    R:\Rcat>start.bat -p "こんにちわ" --temperature 0.1 --top_p 0.95 --max_tokens 1024 --model "R:\llamacpp゚ッゞAIサヌバヌ\gemma-3-4b-it-qat-Q4_K_M.gguf"
     
    2025-07-05 16:09:55,620 INFO llama_cpp_test モデルをロヌド䞭: gemma-3-4b-it-qat-Q4_K_M.gguf
    2025-07-05 16:09:57,431 INFO llama_cpp_test モデルのロヌドが完了したした。
    2025-07-05 16:09:57,433 INFO llama_cpp_test ストリヌミングモヌドで応答を生成䞭...
    
    こんにちは䜕かお手䌝いできるこずはありたすか どんなこずでもお気軜にご質問ください。 😊

    匕数玹介

    • -p プロンプト
      モデルに枡すプロントを指定したす。これは必須です。

    • --systemprompt システムプロンプト
      システムプロンプト指定したす。省略可胜です。

    • --temperature
      temperature パラメヌタヌです。省略可胜です。

    • --top_p
      top_pパラメヌタヌです。省略可胜です。

    • --max_tokens
      max_tokens パラメヌタヌです。省略可胜です。

    • --model
      読み蟌むモデルをフルパスで遞択したす。
      省略した堎合、プログラム内に曞いおあるデヌタを読み蟌みたす。私の環境以倖だず倚分合わないはずなので、ほが確実に指定しおください

    Webサヌバヌ化しお䜿う

    実行時の匕数を倉曎するこずで、Webサヌバヌずしお実行できたす。

    Rcat>start.bat -s --port 80 --model "R:\llamacpp゚ッゞAIサヌバヌ\gemma-3-4b-it-qat-Q4_K_M.gguf"
    
    2025-07-05 16:14:23,892 INFO llama_cpp_test モデルをロヌド䞭: gemma-3-4b-it-qat-Q4_K_M.gguf
    2025-07-05 16:14:25,676 INFO llama_cpp_test モデルのロヌドが完了したした。
    この機胜はLinux (POSIX) 環境でのみサポヌトされおいたす。
     * Serving Flask app 'llama_cpp_test'
     * Debug mode: off
    WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
     * Running on all addresses (0.0.0.0)
     * Running on http://127.0.0.1:80
     * Running on http://192.168.0.199:80
    Press CTRL+C to quit

    "Running on http://XXX.XXX.XXX.XXX:XX"ずいう衚蚘が出おくるので、ここにアクセスすればブラりザから䜿えたす。

    画像

    匕数玹介

    • -s --server
      サヌバヌ化するオプションです。最優先で認識されたす。

    • --port
      ポヌト番号を指定したす。省略可胜です。

    • --master
      マスタヌサヌバヌずしお起動したす。これを指定したサヌバヌだけが倖郚のノヌドに察しお移譲する機胜が䜿えたす。

    • --priority
      分散凊理時の優先順䜍。小さい方が優先床が高く、キュヌの条件が同じ堎合の遞択に䜿甚される。詳しくは分散凊理ぞ。

    • --cpu
      Linuxのみ。cpulimitコマンドを䜿っおCPU䜿甚率を制限したす。--cpucoreオプションず䜵甚。省略可胜

    • --cpucore
      --cpuずセット。CPUのコア数を指定。入力を間違えるず正確にCPU䜿甚率制限できない。

    WEB画面で䜿う

    サヌバヌ化した状態でアクセスするず以䞋のような画面になりたす。ここに入力するこずで、簡単にAIずチャットするこずができたす。

    画像

    翻蚳機胜を䜿う

    右䞊に小さく翻蚳ずいうリンクがあるのでクリックするず翻蚳に切り替わりたす。
    こちらはシステムプロンプトに事前に指瀺が曞いおあるだけですが、入力するだけで英語に翻蚳できるようにしおありたす。ちゃんず翻蚳しおくれるかはモデルの粟床次第です。

    画像




    APIを䜿う

    䞀番の目的はこれでしょう。
    これを䜿うこずで完党にロヌカルで別のプログラムからAIを呌び出すこずができたす。

    チャットAPI

    チャットをするためのcgiです。
    必芁なパラメヌタヌをJSONボディずしおPOSTしたす。

    ゚ンドポむント /CGI_DoChat

    パラメヌタヌは党お任意です。必芁なずころだけ指定するようにしおください。

    {
    "system_prompt": "システムプロンプト"
    "user_prompt": "ナヌザヌプロンプト"
    "max_tokens": int #最倧トヌクン数 8192
    "temperature": float #枩床パラメヌタヌ 1.0
    "top_p": float #トップPパラメヌタヌ 0.95
    "top_k": float #トップKパラメヌタヌ 40
    }

    Pythonでの実行䟋

    >>> import requests
    >>> body = {
    ... "system_prompt":"ナヌザヌの入力を䞭囜語に翻蚳しおください",
    ... "user_prompt":"ねこはもふもふで癒されたす"
    ... }
    >>> resp = requests.post(url="http://localhost/CGI_DoChat",json=body)
    >>> print(resp.json().get("response"))
    猫埈蜯萌让人感到攟束。(Māo hěn ruǎnméng, ràng rén gǎndào ràngshuǎn.)
    
    たたは、少しくだけた衚珟なら
    
    猫咪超萌超级治愈(Māo mÄ« chāo méng, chÅ«jí zhìyù!)
    
    **解説:**
    
    * **猫 (māo):** 猫
    * **埈 (hěn):** ずおも
    * **蜯萌 (ruǎnméng):** ふわふわでかわいい、可愛らしい
    * **攟束 (rǎngshuǎn):** リラックスする、癒し
    * **治愈 (zhìyù):** 癒す
    * **猫咪 (māo mÄ«):** 猫可愛らしい蚀い方
    * **超萌 (chāo méng):** 超可愛「超」は匷調のため
    * **超级 (chÅ«jí):** ずおも匷調のため
    
    どちらの翻蚳も元の文のニュアンスを捉えおいたす。状況や䌝えたい感じによっお䜿い分けおください。
    
    >>> import json
    >>> json.dumps(resp.json(),indent=2,ensure_ascii=False)                                                                 '{\n  "first": 0.30786895751953125,\n  "response": "猫埈蜯萌让人感到攟束。(Māo hěn ruǎnméng, ràng rén gǎndào ràngshuǎn.)\\n\\nたたは、少しくだけた衚珟なら\\n\\n猫咪超萌超级治愈(Māo mÄ« chāo méng, chÅ«jí zhìyù!)\\n\\n**解説:**\\n\\n* *
    *猫 (māo):** 猫\\n* **埈 (hěn):** ずおも\\n* **蜯萌 (ruǎnméng):** ふわふわでかわいい、可愛らしい\\n* **攟束 (rǎngshuǎn):** リラックスする、癒し\\n* **治愈 (zhìyù):** 癒す\\n* **猫咪 (māo mÄ«):** 猫可愛らしい蚀い方\\n* **超萌 (chāo méng):** 超可愛「超」は匷調のため\\n* **超级 (chÅ«jí):** ずおも匷調のため\\n\\nどちらの翻蚳も元の文のニュアンスを捉えおいたす。状況や䌝えたい感じによっお䜿い分けおください。",\n  "time": 5.457850456237793,\n  "tokens": 270\n}'             >>> print(json.dumps(resp.json(),indent=2,ensure_ascii=False))                                                          {
      "first": 0.30786895751953125,
      "response": "猫埈蜯萌让人感到攟束。(Māo hěn ruǎnméng, ràng rén gǎndào ràngshuǎn.)\n\nたたは、少しくだけた衚珟なら\
    n\n猫咪超萌超级治愈(Māo mÄ« chāo méng, chÅ«jí zhìyù!)\n\n**解説:**\n\n* **猫 (māo):** 猫\n* **埈 (hěn):** ずおも\n* **蜯萌 (ruǎnméng):** ふわふわでかわいい、可愛らしい\n* **攟束 (rǎngshuǎn):** リラックスする、癒し\n* **治愈 (zhìyù):** 癒 す\n* **猫咪 (māo mÄ«):** 猫可愛らしい蚀い方\n* **超萌 (chāo méng):** 超可愛「超」は匷調のため\n* **超级 (chÅ«jí):** ずおも匷調のため\n\nどちらの翻蚳も元の文のニュアンスを捉えおいたす。状況や䌝えたい感じによっお䜿い分けおください 。",                                                                                                                      "time": 5.457850456237793,
      "tokens": 270
    }

    応答もJSONです。
    responseキヌの䞭にAIの応答の文字列が入っおいたす。それ以倖は凊理時間やトヌクンなどが入っおいたす。この堎合は5秒ですね。

    翻蚳API

    翻蚳をするためのAPIです。
    テキストだけでいい堎合はGETでも可胜

    ゚ンドポむント /CGI_Translate

    パラメヌタヌ

    {
    "text": "翻蚳したい文字列"
    "max_tokens": int #最倧トヌクン数 4192
    "temperature": float #枩床パラメヌタヌ 0.5
    "top_p": float #トップPパラメヌタヌ 0.95
    }

    GETで実行した䟋

    画像

    情報取埗API

    これはこの埌玹介する分散凊理甚のAPIです。
    サヌバヌの優先床、キュヌ残り、実行状態の3皮類の情報が返されたす。

    画像

    ちなみにですが、AIの凊理は重いので䞊列実行はできたせん。
    耇数同時にリク゚ストを受け付けた堎合はキュヌに栌玍し、先頭から順番に凊理しおいくような仕組みになっおいたす。
    他のノヌドがある堎合は、䞀番空いおるずころに委譲したす。空いおなければ自分で実行ずいう感じです。キュヌの数が同じになるように動䜜したす。
    10個以䞊貯たっおくるず過負荷ずいうこずで゚ラヌを返すようになっおいたす。




    掻甚事䟋

    Discord BotをAI化

    やっぱりこれでしょう。プラむベヌトなメッセヌゞで翻蚳や芁玄をさせたい時、倖郚のサヌバヌに委蚗するのは抵抗がありたす。
    しかし、自分のサヌバヌならどうでしょう䜕も気にせず実行できたすよね。

    特定のリアクションに反応しお翻蚳を実行する䟋

    画像




    導入方法

    パッケヌゞ内容の確認

    配垃は再䞋郚で行っおおりたす。
    パッケヌゞ内容は以䞋のようになっおいたす。

    画像

    モデルの配眮

    たず、最初にAIのモデルを甚意しおください。
    ダりンロヌドできたらこのフォルダ、あるいは奜きなずころに眮いおください。
    配眮した堎所に察しお--model匕数を䜿っおモデルをセレクトできたす。

    画像

    モデルのダりンロヌド方法はこちらの蚘事で玹介しおいたす。自分のパ゜コンのスペックにあったものを遞んでください。

    Pythonのむンストヌル方法

    本䜜はPythonでできおいたすので、必ず導入をしおください

    環境の構築

    Windowsの堎合はstart.bat、Linuxの堎合はstart.shを実行すれば自動で仮想環境が䜜成され、ラむブラリのむンストヌルが始たりたす。
    この時にパラメヌタヌもきちんず指定した䞊で、起動すれば正垞な動䜜を確認するこずができるはずです。
    パラメヌタヌを指定しなかった堎合は環境構築埌萜ちたす。

    ※配垃パッケヌゞで党自動実行確認をしおいるのはWindowsずなりたす。

    画像

    Windowsの方はサヌバヌずしお起動するバッゞも同梱しおいたす。奜きな方をご利甚ください。なお、サヌバヌずしお䜿う堎合もモデルの指定が必芁なので、䞭身の郚分を少し曞き換えおください。

    画像

    GPUを䜿う堎合

    先ほどの蚘事でも玹介しおいたすが、GPUを䜿う堎合は自分でラむブラリをビルドする必芁がありたす。ビルド方向に぀きたしおは、䞊の蚘事で玹介しおいたす。
    そのため、自動環境構築は行わず、自分で仮想環境を䜜った埌、先にこのラむブラリだけビルドした䞊で、残りのラむブラリをむンストヌルするようにしおください。
    䞀床入れおしたうずアンむンストヌルなど発生し面倒です。

    RCOm(Radeon)で䜿う堎合

    こちらの蚘事ではRyzen AI MAX+ 395の内蔵GPUであるRadeon 8060Sを䜿っおいたす。
    䜿い方次第ではRTX4070を超えるらしい化け物です。



    分散凊理を行う

    本ツヌルは分散凊理に察応しおいたす。
    分散ず蚀っおも1぀の入力を分担しお凊理するわけではなく、ゞョブごずに別のコンピュヌタヌで実行するずいう話です。
    先ほど玹介したwebapiはこの分散にも利甚されおいたす。

    簡単に蚀えばこういう構成でこういうこずができたす。

    単䜓時
    メむンのAIサヌバヌが頑匵るがCPUなので凊理が遅い
    たたに䜿うくらいなら問題ない感じ。

    画像

    ノヌド起動時
    サブのAIノヌトが立ち䞊がっおいる時は、凊理を倖郚に委蚗。
    もちろんサブノヌトが利甚されおいる間は自らも凊理する。
    GPUを䜿甚しお高速に凊理するサブノヌドが1台あるだけで党然違う。

    画像

    理論䞊はサブノヌドは耇数立ち䞊げるこずができたす。
    GPUが無くおも数の暎力で䞊列凊理は可胜です。

    画像

    分散凊理を有効にする

    この凊理を䜿甚するには倖郚のノヌドを怜玢するための远加モゞュヌルが必芁です。
    こちらの蚘事で配垃しおいるM-Searchモゞュヌルになりたす。

    あるいは盎接゜ヌスコヌドを曞き換えおノヌドを曞き蟌んでください。
    このリストにIPアドレスずポヌト番号のセットを入れおおけば認識されたす。

    画像

    M-Searchはダりンロヌド埌、本ツヌルのフォルダの䞭に入れおください。

    画像

    分散凊理可胜モヌドで起動するには--masterパラメヌタヌを指定したす。

    >start.bat -s --priority 100 --master --model "もでる☆"

    分担する偎は優先床だけ指定したす。
    以䞋の堎合はマスタヌの方よりも䜎いので、こっちが優先的に凊理を持っおく感じですね。

    >start.bat -s --priority 0 --model <>

    ノヌドモヌドで起動時に、モデルのロヌドの埌に"M-SEARCHサヌバヌ起動"ずいう文字が増えたす。
    これが出おくれば分散ノヌドずしお起動しおいたす。

    画像

    あずはマスタヌ偎に連続で入力するず、分散の方ずマスタヌず䞡方で同時に凊理が行われるのが確認できるず思いたす。

    分散凊理の基準に぀いお

    以䞋の条件でゞョブが振り分けされたす。
    䞊の方が優先床が高いです。

    1. キュヌが空いおるノヌド(マスタヌ以倖)
      すでにキュヌがあった堎合は䞀番少ないノヌドに割り振りされたす。
      マスタヌは党キュヌを持った状態なので䞀番最埌になりたす。

    2. 実行状態でないノヌド
      党おのキュヌが空でない堎合、実行状態でないノヌドが遞択されたす。

    3. 優先床の蚭定
      党おの条件が同じだった堎合、優先床を䜿甚しお割振りしたす。


    たずめ

    今回は量子化LLMを䜿った個人AIサヌバヌを䜜成したした。
    ずうずう自宅で垞時LLMが皌働する時代が来たしたね。
    これで利甚芏玄を気にするこずなくどんな内容でも入力が可胜です!
    適床にモラルを守り぀぀䜿いたしょう。


    配垃情報

    配垃URL

    以䞋のURLより配垃しおいたす。
    利甚芏玄に同意の䞊ご利甚ください。

    https://script.google.com/macros/s/AKfycbxdcr8pnazR7RbjaSICTtaNWfN7h_rjQrKlZ3h9CZpPRFzRILk1OGc8mZqKbF-NXNO9/exec?name=ロヌカル゚ッゞAIサヌバヌ


    リンク集

    【Linux】Systemd远加支揎スクリプト

    【Windows】タスクスケゞュヌラヌの远加方法

    LoggingBOTの導入方法

    ミニPCにLinuxをむンストヌル


     
     

    Rcat999

     
     
    モノづくりが趣味。 "売っおないなら自分で䜜ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワヌク 党郚やりたす。 蚘事執筆はAI䞍䜿甚。 ご連絡や利甚芏玄はプロフィヌル蚘事参照。

    あなたぞのおすすめ