Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit1ff0bc2

Browse files
committed
update multi-model-mamnagement docs.
1 parentf779fb2 commit1ff0bc2

File tree

9 files changed

+137
-40
lines changed

9 files changed

+137
-40
lines changed

‎docs/en/multi_models_manage.md‎

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,14 @@ Example: Registering an Inference Service for a Large Model with the Model Manag
7171
7272
# Initiate Registration Request
7373
curl -X POST -H "Content-Type: application/json" -d '{
74-
"model_name": "proxyllm",
74+
"model_name": "chatglm2-6b",
7575
"body": {
7676
"input": "{USER_PROMPT}",
7777
"model_name": "{MODEL_NAME}"
7878
},
79-
"req_url_template": "http://127.0.0.1/api/generate",
79+
"req_url_template": "http://127.0.0.1:8008/api/generate",
8080
"owner": "operategpt",
81-
"response_extract": "data.items[].attributes.answer"
81+
"response_extract": ""
8282
}' http://127.0.0.1:8007/api/server/register
8383
8484
@@ -90,6 +90,27 @@ curl -X POST -H "Content-Type: application/json" -d '{
9090
9191
```
9292

93+
If your LLM response result is json-format data, you should provide the method to extract the real result, for example:
94+
```
95+
{
96+
"code": "200",
97+
"data": {
98+
"items": [
99+
{
100+
"attributes": {
101+
"answer": "I am ChatGLM2-6B ..."
102+
}
103+
}
104+
]
105+
},
106+
"success": true,
107+
"traceId": "0b46977c16953709036745431ea818"
108+
}
109+
```
110+
111+
>response_extract = "data.items[].attributes.answer"
112+
113+
93114

94115
###3.2 Query models
95116

@@ -118,14 +139,14 @@ curl http://127.0.0.1:8007/api/server/workers
118139
# Initiate Offline Request
119140
curl -X POST -H "Content-Type: application/json" -d '{
120141
"model_name": "chatglm2-6b",
121-
"req_url_template": "https://xxx/openapi/xxx/inference/query"
142+
"req_url_template": "http://127.0.0.1:8008/api/generate"
122143
}' http://127.0.0.1:8007/api/server/offline
123144
124145
125146
# Return Result
126147
{
127148
"success": true,
128-
"msg": "remove llm worker(model_name=chatglm2-6b, url=https://xxx/openapi/xxx/inference/query) succeed!"
149+
"msg": "remove llm worker(model_name=chatglm2-6b, url=http://127.0.0.1:8008/api/generate) succeed!"
129150
}
130151
```
131152

‎docs/zh/multi_models_manage_zh.md‎

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,18 @@
4242
- 可移植代码模块点[这里](../../operategpt/llms)
4343

4444
```commandline
45+
# 推理模型服务配置, .env文件
46+
47+
# 如果是自己要在本地部署私有化模型则设置如: LLM_NAME=chatglm2-6b
48+
# 如果是使用代理模型如ChatGPT则配置如下:
49+
LLM_NAME=proxyllm
50+
OPEN_AI_PROXY_SERVER_URL=https://api.openai.com/v1/chat/completions
51+
OPEN_AI_KEY=sk-xxx
52+
53+
# 配置服务端口, 默认推理服务8008,LLM管理服务8007, 可以启动多个推理服务llmserver然后注册到管理服务上
54+
LLM_SERVER_PORT=8008
55+
LLM_MANAGE_SERVER_PORT=8007
56+
4557
# 启动模型管理服务(也可以将API绑定到自己的应用服务中)
4658
python operategpt/llms/worker_manager.py
4759
@@ -69,14 +81,14 @@ body是请求体
6981
7082
# 注册请求
7183
curl -X POST -H "Content-Type: application/json" -d '{
72-
"model_name": "proxyllm",
84+
"model_name": "chatglm2-6b",
7385
"body": {
7486
"input": "{USER_PROMPT}",
7587
"model_name": "{MODEL_NAME}"
7688
},
77-
"req_url_template": "http://127.0.0.1/api/generate",
78-
"owner": "xuyuan23",
79-
"response_extract": "data.items[].attributes.answer"
89+
"req_url_template": "http://127.0.0.1:8008/api/generate",
90+
"owner": "operategpt",
91+
"response_extract": ""
8092
}' http://127.0.0.1:8007/api/server/register
8193
8294
@@ -88,6 +100,27 @@ curl -X POST -H "Content-Type: application/json" -d '{
88100
89101
```
90102

103+
如果你的LLM推理服务响应是一个json格式数据,你应该提供提取真正结果的方法,例如:
104+
105+
```
106+
{
107+
"code": "200",
108+
"data": {
109+
"items": [
110+
{
111+
"attributes": {
112+
"answer": "I am ChatGLM2-6B ..."
113+
}
114+
}
115+
]
116+
},
117+
"success": true,
118+
"traceId": "0b46977c16953709036745431ea818"
119+
}
120+
```
121+
122+
>response_extract = "data.items[].attributes.answer"
123+
91124

92125
###3.2 模型查询
93126

@@ -116,14 +149,14 @@ curl http://127.0.0.1:8007/api/server/workers
116149
# 发起下线请求
117150
curl -X POST -H "Content-Type: application/json" -d '{
118151
"model_name": "chatglm2-6b",
119-
"req_url_template": "https://xxx/openapi/xxx/inference/query"
152+
"req_url_template": "http://127.0.0.1:8008/api/generate"
120153
}' http://127.0.0.1:8007/api/server/offline
121154
122155
123156
# 返回结果
124157
{
125158
"success": true,
126-
"msg": "remove llm worker(model_name=chatglm2-6b, url=https://xxx/openapi/xxx/inference/query) succeed!"
159+
"msg": "remove llm worker(model_name=chatglm2-6b, url=http://127.0.0.1:8008/api/generate) succeed!"
127160
}
128161
```
129162

‎operate.py‎

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@
3030
VECTOR_STORE_TYPE=os.getenv("VECTOR_STORE_TYPE","Chroma")
3131
EMBEDDING_MODEL=os.getenv("EMBEDDING_MODEL","all-MiniLM-L6-v2")
3232
DOWNLOAD_FOLDER=os.getenv("DOWNLOAD_FOLDER",GENERATED_OPERATE_DATA)
33-
GENERATED_OPERATE_DATA_DEFAULT_DIR=os.getenv("GENERATED_OPERATE_DATA_DEFAULT_DIR","/var/www/html/experience")
33+
GENERATED_OPERATE_DATA_DEFAULT_DIR=os.getenv(
34+
"GENERATED_OPERATE_DATA_DEFAULT_DIR","/var/www/html/experience"
35+
)
3436
LANGUAGE=os.getenv("LANGUAGE","en")
3537
SERVER_MODE=os.getenv("SERVER_MODE","local")
3638

@@ -106,7 +108,11 @@ def embedding_knowledge(content: str, vector_store_name: str):
106108

107109

108110
defparse_image_info(summary_data:str,lang:str)->dict:
109-
images_prompt_info=OperatePromptManager.get_instance().get_prompt(lang).image_desc_prompt.format(summary_data)
111+
images_prompt_info= (
112+
OperatePromptManager.get_instance()
113+
.get_prompt(lang)
114+
.image_desc_prompt.format(summary_data)
115+
)
110116
logger.info(
111117
f"\n====================================images_prompt_info=\n{images_prompt_info}"
112118
)
@@ -129,11 +135,11 @@ def parse_image_info(summary_data: str, lang: str) -> dict:
129135

130136
defdownload_file(download_url:str)->str:
131137
"""
132-
Download image file, store in current dir.
138+
Download image file, store in current dir.
133139
"""
134140
try:
135-
parts=download_url.rsplit('/',2)
136-
origin_file=f'{parts[-2]}/{parts[-1]}'
141+
parts=download_url.rsplit("/",2)
142+
origin_file=f"{parts[-2]}/{parts[-1]}"
137143
filename=f"{GENERATED_OPERATE_DATA_DEFAULT_DIR}/{origin_file}"
138144
os.makedirs(f"{GENERATED_OPERATE_DATA_DEFAULT_DIR}/{parts[-2]}",exist_ok=True)
139145
response=requests.get(download_url)
@@ -152,10 +158,10 @@ def download_file(download_url: str) -> str:
152158

153159
defdownload_video_file(download_url:str)->str:
154160
"""
155-
Download video file, store in current dir.
161+
Download video file, store in current dir.
156162
"""
157163
try:
158-
parts=download_url.rsplit('/',1)
164+
parts=download_url.rsplit("/",1)
159165
origin_file=parts[-1]
160166
filename=f"{GENERATED_OPERATE_DATA_DEFAULT_DIR}/{origin_file}"
161167
response=requests.get(download_url)
@@ -189,9 +195,11 @@ def generate_images(converted_dict: dict) -> str:
189195
# start request stable diffusion:
190196
forimage_name,image_promptinconverted_dict.items():
191197
index+=1
192-
download_url=sd_proxy.sd_request(prompt=image_prompt,image_name=image_name)
198+
download_url=sd_proxy.sd_request(
199+
prompt=image_prompt,image_name=image_name
200+
)
193201

194-
ifSERVER_MODE=='online':
202+
ifSERVER_MODE=="online":
195203
download_url=download_file(download_url)
196204

197205
image_dict.append({"image_name":image_name,"url":download_url})
@@ -205,7 +213,11 @@ def generate_images(converted_dict: dict) -> str:
205213

206214

207215
defparse_video_info(summary_data:str,lang:str)->dict:
208-
videos_prompt_info=OperatePromptManager.get_instance().get_prompt(lang).video_desc_prompt.format(summary_data)
216+
videos_prompt_info= (
217+
OperatePromptManager.get_instance()
218+
.get_prompt(lang)
219+
.video_desc_prompt.format(summary_data)
220+
)
209221
logger.info(
210222
f"\n====================================videos_prompt_info=\n{videos_prompt_info}"
211223
)
@@ -241,7 +253,7 @@ def generate_videos(converted_dict: dict) -> str:
241253
t2v_prompt=T2VPrompt()
242254
t2v_prompt.prompt=video_prompt
243255
download_url=t2v_request(t2v_prompt)
244-
ifSERVER_MODE=='online':
256+
ifSERVER_MODE=="online":
245257
download_url=download_video_file(download_url)
246258
ifdownload_urlisNone:
247259
continue
@@ -264,7 +276,7 @@ def write_markdown_content(content, filename, filepath):
264276

265277
withopen(full_path,"w")asfile:
266278
file.write(content)
267-
returnfull_pathifSERVER_MODE=='local'elsef"{DOWNLOAD_FOLDER}/{filename}.md"
279+
returnfull_pathifSERVER_MODE=="local"elsef"{DOWNLOAD_FOLDER}/{filename}.md"
268280

269281

270282
defstartup(idea:str,lang:str=Language.ENGLISH.value):
@@ -312,15 +324,22 @@ def startup(idea: str, lang: str = Language.ENGLISH.value):
312324
video_data=generate_videos(video_prompt_dict)
313325
logger.info(f"\ncompleted generate_videos=\n{video_data}")
314326

315-
prompt_req=OperatePromptManager.get_instance().get_prompt(lang).operate_prompt.format(summary_data,image_data,
316-
video_data)
327+
prompt_req= (
328+
OperatePromptManager.get_instance()
329+
.get_prompt(lang)
330+
.operate_prompt.format(summary_data,image_data,video_data)
331+
)
317332
logger.info(f"\ngenerated markdown content prompt request=\n{prompt_req}")
318333

319334
result=query_from_openai_proxy(prompt_req)
320335
logger.info(f"\ngenerated markdown content:\n{result}")
321336

322337
download_url=write_markdown_content(
323-
result,operation_name,GENERATED_OPERATE_DATAifSERVER_MODE=='local'elseGENERATED_OPERATE_DATA_DEFAULT_DIR
338+
result,
339+
operation_name,
340+
GENERATED_OPERATE_DATA
341+
ifSERVER_MODE=="local"
342+
elseGENERATED_OPERATE_DATA_DEFAULT_DIR,
324343
)
325344

326345
logger.info(f"\nwrite file completed, download_url={download_url}")

‎operategpt/llms/llmserver.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
worker:Worker=Worker(LLM_NAME)
2323

2424

25-
@app.post("/generate")
25+
@app.post("/api/generate")
2626
defgen(req:LLMReq):
2727
print(f"input={req.input}")
2828
msg:ModelMessage=ModelMessage(role="human",content=req.input)

‎operategpt/llms/worker/worker.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def __init__(
3737
self,
3838
model_name:str,
3939
req_type:str="POST",
40-
req_url_template:str="http://localhost:8008/generate",
40+
req_url_template:str="http://localhost:8008/api/generate",
4141
req_param:dict=None,
4242
is_stream:bool=False,
4343
header:dict=None,

‎operategpt/llms/worker_manager.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ def chat(conn_dict: dict):
218218
returnWorkerManager.get_instance().remove_worker(conn)
219219

220220

221-
@app.post("/api/server/workers")
221+
@app.get("/api/server/workers")
222222
defworkers():
223223
wk_map:Dict[str,List["Worker"]]=WorkerManager.get_instance().get_all_workers()
224224

‎operategpt/prompt/lang.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33

44
classLanguage(Enum):
5-
ENGLISH='en'
6-
CHINESE='zh'
5+
ENGLISH="en"
6+
CHINESE="zh"
77

88
@classmethod
99
defget_all_langs(cls):

‎operategpt/prompt/operate_prompt.py‎

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ class OperatePrompt:
66
image_desc_prompt:str
77
video_desc_prompt:str
88

9-
def__init__(self,operate_prompt:str,image_decs_prompt:str,video_desc_prompt:str):
9+
def__init__(
10+
self,operate_prompt:str,image_decs_prompt:str,video_desc_prompt:str
11+
):
1012
self.operate_prompt=operate_prompt
1113
self.image_desc_prompt=image_decs_prompt
1214
self.video_desc_prompt=video_desc_prompt
@@ -20,8 +22,12 @@ def __new__(cls):
2022
cls._instance=super().__new__(cls)
2123
cls._instance.prompts= {}
2224
print("INIT operate manager running!")
23-
prompt_en:OperatePrompt=OperatePrompt(OPERATE_PROMPT,IMAGE_DESC_PROMPT,VIDEO_DESC_PROMPT)
24-
prompt_zh:OperatePrompt=OperatePrompt(OPERATE_PROMPT_ZH,IMAGE_DESC_PROMPT_ZH,VIDEO_DESC_PROMPT_ZH)
25+
prompt_en:OperatePrompt=OperatePrompt(
26+
OPERATE_PROMPT,IMAGE_DESC_PROMPT,VIDEO_DESC_PROMPT
27+
)
28+
prompt_zh:OperatePrompt=OperatePrompt(
29+
OPERATE_PROMPT_ZH,IMAGE_DESC_PROMPT_ZH,VIDEO_DESC_PROMPT_ZH
30+
)
2531
cls._instance.prompts[Language.ENGLISH.value]=prompt_en
2632
cls._instance.prompts[Language.CHINESE.value]=prompt_zh
2733
print("INIT operate manager succeed!")
@@ -121,4 +127,3 @@ def get_instance(cls):
121127
<VideoPrompt> {{"video-name-1": "<summary content1>"}} </VideoPrompt>
122128
123129
"""
124-

‎operategpt_server.py‎

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,28 @@ class User(Base):
7373
defcreate_task(user_id:int,prompt:str,lang:str="en"):
7474
try:
7575
iflangnotinLanguage.get_all_langs():
76-
return {"success":False,"msg":f"create task failed: lang{lang} is not supported!"}
76+
return {
77+
"success":False,
78+
"msg":f"create task failed: lang{lang} is not supported!",
79+
}
7780
task_uuid=generate_uuid()
7881
session=Session()
79-
task=Task(user_id=user_id,prompt=prompt,status="init",uuid=task_uuid,gmt_create=datetime.now(),gmt_modified=datetime.now(),lang=lang)
82+
task=Task(
83+
user_id=user_id,
84+
prompt=prompt,
85+
status="init",
86+
uuid=task_uuid,
87+
gmt_create=datetime.now(),
88+
gmt_modified=datetime.now(),
89+
lang=lang,
90+
)
8091
session.add(task)
8192
session.commit()
8293
session.close()
83-
return {"success":True,"msg":f"create task success, please remember taskid for query result! uuid={task_uuid}"}
94+
return {
95+
"success":True,
96+
"msg":f"create task success, please remember taskid for query result! uuid={task_uuid}",
97+
}
8498
exceptExceptionase:
8599
return {"success":False,"msg":f"create task failed:{str(e)}"}
86100

@@ -89,7 +103,11 @@ def create_task(user_id: int, prompt: str, lang: str = "en"):
89103
deflist_tasks(task_uuid:str):
90104
session=Session()
91105
task=session.query(Task).filter(Task.uuid==task_uuid).first()
92-
init_task_count=session.query(func.count(Task.id)).filter(Task.id<task.id,Task.status=='init').scalar()
106+
init_task_count= (
107+
session.query(func.count(Task.id))
108+
.filter(Task.id<task.id,Task.status=="init")
109+
.scalar()
110+
)
93111
session.close()
94112
task_dict= {
95113
"id":task.id,
@@ -100,7 +118,7 @@ def list_tasks(task_uuid: str):
100118
"gmt_modified":str(task.gmt_modified),
101119
"lang":str(task.lang),
102120
"result":task.result,
103-
"queue_count":init_task_count
121+
"queue_count":init_task_count,
104122
}
105123
returnResult.success(task_dict)
106124

@@ -166,6 +184,7 @@ def execute_task(task):
166184

167185
defstart_task_processing():
168186
importthreading
187+
169188
thread=threading.Thread(target=process_tasks)
170189
thread.start()
171190

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp