-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathalt_llama_cpp.py
More file actions
177 lines (156 loc) · 6.84 KB
/
alt_llama_cpp.py
File metadata and controls
177 lines (156 loc) · 6.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#Qwen2.5-Coder-32B製。llama.cppのllama-serverをllama-cpp-pythonライクに操作するライブラリ
from openai import OpenAI
import subprocess
from typing import List, Optional
llama_server_path = "llama_cpp"#llama-server 実行ファイルのパスを指定
llama_server_process = None # グローバル変数としてプロセスオブジェクトを保持
def start_llama_server(model_path: str,
n_gpu_layers: Optional[int] = None,
n_ctx: Optional[int] = 512,
n_batch: Optional[int] = 512,
flash_attn: Optional[bool] = None,
no_mmap: Optional[bool] = None,
tensor_split: Optional[List[int]] = None,
last_n_tokens_size: Optional[int] = 64,
override_tensor: Optional[str]= None) -> None:
"""
llama-server.exe を起動する関数
Args:
model_path (str): モデルのファイルパス
n_gpu_layers (Optional[int]): GPUレイヤーの数 (デフォルト: None)
n_ctx (Optional[int]): コンテキストサイズ (デフォルト: 512)
n_batch (Optional[int]): バッチサイズ (デフォルト: 512)
flash_attn (Optional[bool]): Flash Attention を使用するかどうか (デフォルト: None)
no_mmap (Optional[bool]):メモリマップを無効化します (デフォルト: None)
tensor_split (Optional[List[int]]): テンソルの分割比率 (デフォルト: None)
last_n_tokens_size (Optional[int]): 最後のnトークンのサイズ (デフォルト: 64)
override_tensor (Optional[str]):テンソルバッファタイプをオーバーライドします (デフォルト: None)
"""
global llama_server_process # グローバル変数を使用
command = [
f"{llama_server_path}\\llama-server.exe",
"-m", model_path
]
if n_gpu_layers is not None:
if n_gpu_layers == -1:
command.extend(["-ngl", "9999"])
else:
command.extend(["-ngl", str(n_gpu_layers)])
if n_ctx is not None:
command.extend(["-c", str(n_ctx)])
if n_batch is not None:
command.extend(["-b", str(n_batch)])
if flash_attn is True:
command.append("-fa")
if no_mmap is True:
command.append("--no-mmap")
if tensor_split is not None:
command.extend(["-ts", ",".join(map(str, tensor_split))])
if last_n_tokens_size is not None:
command.extend(["--repeat-last-n", str(last_n_tokens_size)])
if override_tensor is not None:
command.extend(["-ot", str(override_tensor)])
try:
llama_server_process = subprocess.Popen(
command,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True, # テキストモードで出力を扱う
encoding='utf-8' # UTF-8 でエンコード
)
# 出力をキャプチャして表示
for line in llama_server_process.stdout:
print(f"{line.strip()}")
if line.strip() == "srv update_slots: all slots are idle":
#print("llama-server を正常に起動しました。")
break
return "load_complate"
except Exception as e:
print(f"llama-server の起動中にエラーが発生しました: {e}")
# 使用例
#start_llama_server(
# model_path="F:\\gguf\\sarashina2.1-1b-sft-imatrix-Q8_0-4329.gguf",
# n_gpu_layers=32,
# n_ctx=512,
# n_batch=512,
# flash_attn=True,
# no_mmap=True,
# override_tensor="blk\\\.([0-9]*[05])\\\.ffn_.*_exps\\\.=CPU",
# tensor_split=[100, 0],
# last_n_tokens_size=64
#)
def stop_llama_server():
"""
起動中の llama-server.exe を終了する関数
"""
global llama_server_process # グローバル変数を使用
if llama_server_process is not None:
llama_server_process.terminate() # プロセスを終了
llama_server_process = None # プロセスオブジェクトをリセット
#print("llama-server を正常に終了しました。")
else:
#print("llama-server は起動していません。")
pass
# 使用例
#stop_llama_server()
def response(prompt,max_tokens=16,temperature=0.8, top_p=0.95, frequency_penalty=0.0, presence_penalty=0.0,seed=-1,stop=None, stream=False):
"""
起動中の llama-server.exe に回答してもらう関数
Args:
prompt (str): プロント (デフォルト: None)
max_tokens (int): 最大出力トークン (デフォルト: 16)
temperature (Optional[float]): 温度 (デフォルト: 0.8)
top_p (Optional[float]): (デフォルト: 0.95)
frequency_penalty (Optional[float]): (デフォルト: 0.0)
presence_penalty (Optional[float]): (デフォルト: 0.0)
seed (Optional[int]): シード値 (デフォルト: -1)
stop (Optional[list[str]]): ストップトークン (デフォルト: None)
stream (Optional[bool]): ストリーミング出力する (デフォルト: False)
"""
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="http://localhost:8080/v1"
)
messages = [
{"role": "user", "content": prompt},
]
stream_options = {"include_usage": True} if stream else None
response = client.chat.completions.create(
model="gpt-4",
messages=messages,
max_tokens=max_tokens,
temperature=temperature,
top_p=top_p,
frequency_penalty=frequency_penalty,
presence_penalty=presence_penalty,
seed=seed,
stop=stop if stop is not None else [],
stream=stream,
stream_options=stream_options,
)
return response
#使用例1(通常出力)
#system_prompt="あなたは優秀で誠実なアシスタントです"
#prompt = system_prompt+"こんにちは"
#response = alt_llama_cpp.response(prompt,
# stream=False)
#通常出力の処理
#output = response.choices[0].message.content
#print(output)
#
#alt_llama_cpp.stop_llama_server()#llama-serverを終了してVRAM/RAMを開放する
#使用例2(ストリーミング出力)
#system_prompt="あなたは優秀で誠実なアシスタントです"
#prompt = system_prompt+"東京の魅力を100文字で教えて"
#response = alt_llama_cpp.response(prompt,
# max_tokens=512,
# temperature = 0.6,
# top_p=0.95,
# stop=["<|stop|>"] ,
# stream=True)
#ストリーミング出力の処理
#for chunk in response:
# output = chunk.choices[0].delta.content
# if output:
# print(output,end="",flush=True)
#alt_llama_cpp.stop_llama_server()#llama-serverを終了してVRAM/RAMを開放する