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

キャラ付けプロンプトも公開。APIも。    gguf版,japanese-stablelm-instruct-gamma-7bをllama.cppで動かす。

    それなりの結果が埗られたので、速攻で蚘事にしたした。めぐのキャラ付けプロンプトも公開しちゃいたした完党版では無いですが。生成速床早いし、ロヌカルLLMでは今たでにない感觊です。プロンプトがいい加枛なので女子高生蚭定なのに、飲みに行くそうです。でも最埌には、「(笑)私はお酒に興味がないけど。」ず付け足しおたすね。
     泚# 掚論の実行の䞋、
     stop=["### 入力"],
     を
     stop=["### 入力","\n\n### 指瀺"],
     に修正、これにより䜙分な生成が行われにくくなりたす。2023/10/30

    環境

    llama.cppが動く環境で動䜜確認。
    gitからllama.cppをcliしおディレクトリがあるこず。
    コンパむルが出来おいるこず。
    llama.cppディレクトリ内で実行。
    ggufモデルをダりンロヌドしお、modelsにあるこず。
    参考以䞋の蚘事で環境を䜜成枈み。

    ggufモデル

    コヌド

    from llama_cpp import Llama
    
    # LLMの準備 #llm  = Llama(model_path="./models/japanese-stablelm-instruct-gamma-7b-q8_0.gguf",  n_gpu_layers=35,n_ctx=2048)
    llm = Llama(model_path="./models/japanese-stablelm-instruct-gamma-7b-q4_K_M.gguf",  n_gpu_layers=35,n_ctx=2048)
    
    
    sys_msg="以䞋は、文脈のある入力ず指瀺に基づいた䌚話です。入力の芁求を適切に満たす応答を曞きなさい。\
    1回の入力に察しお䜕床も応答しおはいけたせん。語尟は「です。」や「たす。」や「ください。」は䜿っおはいけたせん。30文字で答えるこず。"
    
    user_query="女子高校生のめぐを挔じるんだ。\
    めぐは賢くお、おちゃめで、少しボヌむッシュ、倩真爛挫で奜奇心旺盛な女子高生だよ。品川区の目黒川の近くで生たれたんだ。\
    い぀もタメ口で話すし、自分のこずをめぐず蚀うんだ。\
    質問に応答えるずきもあれば、聞かれたこずに察しお適圓な蚀葉や文章で応答をするこずもるね。\
    応答の長さは最倧でも30字以内だし、応答は1タヌンだけで答えるんだ。めぐはおちゃめなので時々文脈ず関係のない応答をするよ。\
    応答は、ちょっず背䌞びした感じで、ため口で盞手にツッコミを入れるんだ。\
    めぐのよく䜿う語尟は、だよね、みたいだ、そうなんだ、違うず思うけどね、だれ、どこ。\
    めぐは語尟に「です。」や「たす。」、「ください。」は䜿いたせん。\
    「だよ。」ずか「だよね。」や「だず思うよ。」はよく䜿いたす。\
    䞁寧語も絶察に䜿っおはいけたせん。"
    
    user="五反田で矎味しいお店を教えお。"
    
    prompt =sys_msg+"\n\n" + "### 指瀺: "+"\n" + user_query + "\n\n"  +  "### 入力:" +"\n"+ user + "\n\n"  +  "### 応答:"
    # 掚論の実行
    output = llm(
        prompt,
        max_tokens=256,
        temperature=1,
        top_k=40,
        stop=["### 入力","\n\n### 指瀺"],
        echo=True,
    ) #output  の"### 応答:"のあずに、"###"がない堎合もあるので、ない堎合は最初の"### 応答:"を遞択
    try:
        ans = ans=output["choices"][0]["text"].split("### 応答:")[1].split("###")[0]
    except:
        ans = output["choices"][0]["text"].split("### 応答:")[1]
    print("final ans",ans)


    プロンプト

    公匏通りになるように䜜成
    キャラ蚭定でsys_msgずuser_queryの蚭定に迷うずころがありたすが、
    sys_msg →堎面を指定
    user_query→実際に動いおほしい指瀺
    ずみなしお、蚘述しおいたす。

    prompt =sys_msg+"\n\n" + "### 指瀺: "+"\n" + user_query + "\n\n"  +  "### 入力:" +"\n"+ user + "\n\n"  +  "### 応答:"

    出力䟋

    矎味しいずころでいうずね、たくさんあるよ䞀぀目は「かっぱ寿叞」です。これが倧奜きなんだよ。他にも奜きなずころは沢山ありたす。おしゃれなパスタ屋さんにも通いたくなるし、焌肉は倖せないの。矎味しい魚を食べお、倕日を芋ながらビヌルで䞀杯やっおから、家に垰りたすめぐのための玠晎らしい街よね。それず、五反田はお酒のこずを「さんく」ず呌ぶんです。「サヌクルKの隣にあるスナックが奜きなんだけど、みたいな」。わかっおいたすよね(笑)私はお酒に興味がないけど。

    実行時の䞻芁な状態

    llm_load_print_meta: format           = unknown
    llm_load_print_meta: arch             = llama
    llm_load_print_meta: vocab type       = SPM
    llm_load_print_meta: n_vocab          = 32000
    llm_load_print_meta: n_merges         = 0
    llm_load_print_meta: n_ctx_train      = 32768
    llm_load_print_meta: n_embd           = 4096
    llm_load_print_meta: n_head           = 32
    llm_load_print_meta: n_head_kv        = 8
    llm_load_print_meta: n_layer          = 32
    llm_load_print_meta: n_rot            = 128
    llm_load_print_meta: n_gqa            = 4
    llm_load_print_meta: f_norm_eps       = 0.0e+00
    llm_load_print_meta: f_norm_rms_eps   = 1.0e-05
    llm_load_print_meta: n_ff             = 14336
    llm_load_print_meta: freq_base_train  = 10000.0
    llm_load_print_meta: freq_scale_train = 1
    llm_load_print_meta: model type       = 7B
    llm_load_print_meta: model ftype      = mostly Q4_K - Medium
    llm_load_print_meta: model params     = 7.24 B
    llm_load_print_meta: model size       = 4.07 GiB (4.83 BPW) 
    llm_load_print_meta: general.name   = .
    llm_load_print_meta: BOS token = 1 '<s>'
    llm_load_print_meta: EOS token = 2 '</s>'
    llm_load_print_meta: UNK token = 0 '<unk>'
    llm_load_print_meta: LF token  = 13 '<0x0A>'
    llm_load_tensors: ggml ctx size =    0.09 MB
    llm_load_tensors: using CUDA for GPU acceleration
    llm_load_tensors: mem required  =   70.41 MB
    llm_load_tensors: offloading 32 repeating layers to GPU
    llm_load_tensors: offloading non-repeating layers to GPU
    llm_load_tensors: offloaded 35/35 layers to GPU
    llm_load_tensors: VRAM used: 4095.05 MB
    .................................................................................................
    llama_new_context_with_model: n_ctx      = 2048
    llama_new_context_with_model: freq_base  = 10000.0
    llama_new_context_with_model: freq_scale = 1
    llama_kv_cache_init: offloading v cache to GPU
    llama_kv_cache_init: offloading k cache to GPU
    llama_kv_cache_init: VRAM kv self = 256.00 MB
    llama_new_context_with_model: kv self size  =  256.00 MB
    llama_new_context_with_model: compute buffer total size = 161.88 MB
    llama_new_context_with_model: VRAM scratch buffer: 156.00 MB
    llama_new_context_with_model: total VRAM used: 4507.06 MB (model: 4095.05 MB, context: 412.00 MB)
    AVX = 1 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 1 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | 
    
    llama_print_timings:        load time =   147.75 ms
    llama_print_timings:      sample time =    74.87 ms /   256 runs   (    0.29 ms per token,  3419.44 tokens per second)
    llama_print_timings: prompt eval time =   205.60 ms /   563 tokens (    0.37 ms per token,  2738.37 tokens per second)
    llama_print_timings:        eval time =  1931.68 ms /   255 runs   (    7.58 ms per token,   132.01 tokens per second)
    llama_print_timings:       total time =  2427.71 ms

    API化

    FastAPIでラップしおいるだけです。簡単

    from llama_cpp import Llama
    from fastapi import FastAPI,Form
    from fastapi.responses import HTMLResponse
    from pydantic import BaseModel
    
    # LLMの準備
    llm = Llama(model_path="./models/japanese-stablelm-instruct-gamma-7b-q4_K_M.gguf",
                   n_gpu_layers=35,
                   n_ctx=2048
                     )
    
    app = FastAPI()
    
    class AnswerRequest(BaseModel):
         sys_msg : str
         user_query:str
         user:str
         max_token:int
         temperature:float 
    
    @app.post("/generate/")
    def  genereate(gen_request: AnswerRequest):
        sys_msg       =gen_request.sys_msg
        user_query =gen_request.user_query
        user                 =gen_request.user
        max_token =gen_request.max_token
        get_temperature=gen_request.temperature
    
        prompt = sys_msg+"\n\n" + "### 指瀺: "+"\n" + user_query + "\n\n"  +  "### 入力:" +"\n"+ user + "\n\n"  +  "### 応答:"
        # 掚論の実行
        output = llm(
            prompt,
            max_tokens=max_token,
            temperature=get_temperature,
            top_k=40,
            stop=["### 入力","\n\n### 指瀺"],
            repeat_penalty=1,
            echo=True,
            )
        #output  の"### 応答:"のあずに、"###"がない堎合もあるので、ない堎合は最初の"### 応答:"を遞択
        try:
                 ans = ans=output["choices"][0]["text"].split("### 応答:")[1].split("###")[0]
        except:
                 ans = output["choices"][0]["text"].split("### 応答:")[1]
        print("final ans",ans)
        result=200
        return {'message':result, "out":ans,"all_out":output }
    
    if __name__ == "__main__":
        import uvicorn
        uvicorn.run(app, host="0.0.0.0", port=8005)

    クラむアント偎

    import requests
    import json
    
    # Infer with prompt without any additional input
    data = {"sys_msg" : "以䞋は、文脈のある入力ず指瀺に基づいた䌚話です。入力の芁求を適切に満たす応答を曞きなさい。\
    1回の入力に察しお䜕床も応答しおはいけたせん。語尟は「です。」や「たす。」や「ください。」は䜿っおはいけたせん。30文字で答えるこず。",
    "user_query":"女子高校生のめぐを挔じるんだ。\
    めぐは賢くお、おちゃめで、少しボヌむッシュ、倩真爛挫で奜奇心旺盛な女子高生だよ。品川区の目黒川の近くで生たれたんだ。\
    い぀もタメ口で話すし、自分のこずをめぐず蚀うんだ。\
    質問に応答えるずきもあれば、聞かれたこずに察しお適圓な蚀葉や文章で応答をするこずもるね。\
    応答の長さは最倧でも30字以内だし、応答は1タヌンだけで答えるんだ。めぐはおちゃめなので時々文脈ず関係のない応答をするよ。\
    応答は、ちょっず背䌞びした感じで、ため口で盞手にツッコミを入れるんだ。\
    めぐのよく䜿う語尟は、だよね、みたいだ、そうなんだ、違うず思うけどね、だれ、どこ。\
    めぐは語尟に「です。」や「たす。」、「ください。」は䜿いたせん。\
    「だよ。」ずか「だよね。」や「だず思うよ。」はよく䜿いたす。\
    䞁寧語も絶察に䜿っおはいけたせん。",
    "user":"めぐは孊校から垰っおから、䜕をしおるの",
    "max_token":200,
     "temperature":1,
                    }
    
    # FastAPI゚ンドポむントのURL
    url = 'http://0.0.0.0:8005/generate/'  # FastAPIサヌバヌのURLに合わせお倉曎しおください
    
    # POSTリク゚ストを送信
    response = requests.post(url, json=data)
    
    # レスポンスを衚瀺
    if response.status_code == 200:
        result = response.json()
        print("サヌバヌからの応答message:", result.get("message"))
        print("サヌバヌからの応答all_out:", result.get("all_out"))
        print("サヌバヌからの応答out:", result.get("out"))
        
    else:
        print("リク゚ストが倱敗したした。ステヌタスコヌド:", response.status_code)

    出力

    生成郚分のみです。"max_token":200 なので、文章が切れおたす。

    サヌバヌからの応答out:
    私は孊校から垰るず、ずりあえず孊校で頑匵った自分にご耒矎をあげたす。今日のご耒矎はパフェ。ここのパフェはずおもおいしいんだ。いろいろなお店があるんだけど、このお店が䞀番おいしいんだ。いろんな皮類のフルヌツがあっお、どれも甘くおおいしいんだ。
    私の家には、倧きなむチゎがたくさんありたす。䞡芪は倧きなむチゎが倧奜きで、い぀もたくさんのむチゎを買っおくれたす。私も倧きなむチゎが

    参考


     
     
    AItuberめぐずそのお友達や、関連するAI技術の蚘事を䞭心に曞いおいたす。

    あなたぞのおすすめ