fix bugs for interactive of /node add

This commit is contained in:
streetycat
2023-12-04 08:15:28 +00:00
committed by zhangzhen
parent a001706752
commit 15046f0254
4 changed files with 84 additions and 72 deletions
@@ -1,9 +1,6 @@
import json
import logging import logging
import requests import requests
from typing import Optional, List
from pydantic import BaseModel
from aios import ComputeTask,Queue_ComputeNode, ComputeTaskResult, ComputeTaskResultCode, ComputeTaskState, ComputeTaskType,AIStorage,UserConfig from aios import ComputeTask,Queue_ComputeNode, ComputeTaskResult, ComputeTaskResultCode, ComputeTaskState, ComputeTaskType,AIStorage,UserConfig
@@ -1,13 +1,19 @@
from prompt_toolkit import PromptSession import os
from prompt_toolkit import HTML, PromptSession, print_formatted_text
from prompt_toolkit.styles import Style from prompt_toolkit.styles import Style
from service.aios_shell.local_compute_node_builder.local_llama_node_builder import LocalLlamaNodeBuilder from service.aios_shell.local_compute_node_builder.local_llama_node_builder import LocalLlamaNodeBuilder
from .local_compute_node_builder import BuilderState, LocalComputeNodeBuilder from .local_compute_node_builder import BuilderState, LocalComputeNodeBuilder
from aios_kernel.storage import AIStorage
async def build(prompt_session: PromptSession, shell_style: Style) -> str or None: async def build(prompt_session: PromptSession, shell_style: Style) -> str or None:
# model_type = await prompt_session.prompt_async(f"Please select the node server type (default: llama.cpp):", style = shell_style) # model_type = await prompt_session.prompt_async(f"Please select the node server type (default: llama.cpp):", style = shell_style)
model_type = 'llama.cpp' model_type = 'llama.cpp'
download_dir = AIStorage.get_instance().get_download_dir()
if not os.path.exists(download_dir):
os.mkdir(download_dir)
state = BuilderState(prompt_session, shell_style) state = BuilderState(prompt_session, shell_style)
match model_type: match model_type:
@@ -19,7 +25,9 @@ async def build(prompt_session: PromptSession, shell_style: Style) -> str or Non
if param is None: if param is None:
return None return None
value = await state.prompt_session.prompt_async(f"{state.last_result_prompt}{param.desc}:", style = state.shell_style) if state.last_result_prompt or param.desc:
print_formatted_text(f"{state.last_result_prompt}{param.desc}", style = state.shell_style)
value = await state.prompt_session.prompt_async(f"{param.prompt}:", style = state.shell_style)
if value: if value:
value = value.strip() value = value.strip()
@@ -24,8 +24,9 @@ class ParameterApplier:
pass pass
class BuildParameter: class BuildParameter:
def __init__(self, name: str, applier: ParameterApplier, desc: str or None = None, default_value: str or None = None): def __init__(self, name: str, applier: ParameterApplier, prompt: str or None = None, desc: str or None = None, default_value: str or None = None):
self.name = name self.name = name
self.prompt = prompt
self.desc = desc self.desc = desc
self.default_value = default_value self.default_value = default_value
self.applier = applier self.applier = applier
@@ -97,12 +97,13 @@ class ParameterExternParamsApplier:
async def apply(self, state: BuilderState, name: str, value: str or None = None) -> str or None: async def apply(self, state: BuilderState, name: str, value: str or None = None) -> str or None:
extern_params = value extern_params = value
docker_image = "" docker_image = ""
gpu_options = None gpu_options = []
state.next_step += 1
if state.params["n_gpu_layers"] == "0": if state.params["n_gpu_layers"] == "0":
docker_image = "ghcr.io/abetlen/llama-cpp-python:latest" docker_image = "ghcr.io/abetlen/llama-cpp-python:latest"
else: else:
gpu_options = "--gpus all" gpu_options = ["--gpus", "all"]
llama_cpp_python_repo_url = "https://github.com/abetlen/llama-cpp-python.git" llama_cpp_python_repo_url = "https://github.com/abetlen/llama-cpp-python.git"
download_path = AIStorage.get_instance().get_download_dir() download_path = AIStorage.get_instance().get_download_dir()
llama_cpp_python_path = download_path + "/llama-cpp-python" llama_cpp_python_path = download_path + "/llama-cpp-python"
@@ -115,9 +116,10 @@ class ParameterExternParamsApplier:
if os.path.exists(llama_cpp_python_path): if os.path.exists(llama_cpp_python_path):
result = subprocess.run(['git', 'pull'], cwd = llama_cpp_python_path, stdout = subprocess.PIPE, stderr = subprocess.PIPE, text = True) result = subprocess.run(['git', 'pull'], cwd = llama_cpp_python_path, stdout = subprocess.PIPE, stderr = subprocess.PIPE, text = True)
else: else:
result = subprocess.run(['git', 'clone', llama_cpp_python_repo_url, download_path], stdout = subprocess.PIPE, stderr = subprocess.PIPE, text = True) result = subprocess.run(['git', 'clone', llama_cpp_python_repo_url, llama_cpp_python_path], stdout = subprocess.PIPE, stderr = subprocess.PIPE, text = True)
if result.stderr: if result.stderr:
print_formatted_text(FormattedText([("class:warn", result.stderr)]), style = state.shell_style)
while True: while True:
sel = await state.prompt_session.prompt_async(f"Update 'llama-cpp-python' failed, you can press 'r' to retry, or 'c' to continue with the current version.", style = state.shell_style) sel = await state.prompt_session.prompt_async(f"Update 'llama-cpp-python' failed, you can press 'r' to retry, or 'c' to continue with the current version.", style = state.shell_style)
if sel == 'r': if sel == 'r':
@@ -139,6 +141,7 @@ class ParameterExternParamsApplier:
result = subprocess.run(['docker', 'build', '-t', docker_image, f"{llama_cpp_python_path}/docker/cuda_simple/"], stdout = subprocess.PIPE, stderr = subprocess.PIPE, text = True) result = subprocess.run(['docker', 'build', '-t', docker_image, f"{llama_cpp_python_path}/docker/cuda_simple/"], stdout = subprocess.PIPE, stderr = subprocess.PIPE, text = True)
if result.stderr: if result.stderr:
print_formatted_text(FormattedText([("class:warn", result.stderr)]), style = state.shell_style)
while True: while True:
sel = await state.prompt_session.prompt_async(f"Build the image failed, you can press 'r' to retry, or 'c' to continue with the current version.", style = state.shell_style) sel = await state.prompt_session.prompt_async(f"Build the image failed, you can press 'r' to retry, or 'c' to continue with the current version.", style = state.shell_style)
if sel == 'r': if sel == 'r':
@@ -152,12 +155,12 @@ class ParameterExternParamsApplier:
break break
retry = True retry = True
while True: while retry:
retry = False retry = False
run_options = ['docker', 'run', '-d'] run_options = ['docker', 'run', '-d']
if gpu_options: if gpu_options:
run_options.append(gpu_options) run_options.extend(gpu_options)
run_options.extend([ run_options.extend([
'-p', f"{state.params['port']}:8000", '-p', f"{state.params['port']}:8000",
@@ -172,9 +175,12 @@ class ParameterExternParamsApplier:
if extern_params: if extern_params:
run_options.extend(extern_params.split(' ')) run_options.extend(extern_params.split(' '))
print_formatted_text(FormattedText([("class:prompt", f"Will start service with: {' '.join(run_options)}")]), style = state.shell_style)
result = subprocess.run(run_options, stdout = subprocess.PIPE, stderr = subprocess.PIPE, text = True) result = subprocess.run(run_options, stdout = subprocess.PIPE, stderr = subprocess.PIPE, text = True)
if result.stderr: if result.stderr:
print_formatted_text(FormattedText([("class:warn", result.stderr)]), style = state.shell_style)
while True: while True:
sel = await state.prompt_session.prompt_async(f"Start the node service failed, you can press 'r' to retry, or 'a' to abort.", style = state.shell_style) sel = await state.prompt_session.prompt_async(f"Start the node service failed, you can press 'r' to retry, or 'a' to abort.", style = state.shell_style)
if sel == 'r': if sel == 'r':
@@ -209,31 +215,31 @@ class ParameterExternParamsApplier:
_recommend_model_urls = { _recommend_model_urls = {
"1": { "1": {
"model": "Llama-2-70B-chat", "model": "Llama-2-70B-Chat-GGUF",
"url": "https://huggingface.co/TheBloke/Llama-2-70B-chat-GGUF/resolve/main/llama-2-70b-chat.Q4_0.gguf" "url": "https://huggingface.co/TheBloke/Llama-2-70B-chat-GGUF/resolve/main/llama-2-70b-chat.Q4_0.gguf"
}, },
"2": { "2": {
"model": "Llama-2-13B-chat", "model": "Llama-2-13B-Chat-GGUF",
"url": "https://huggingface.co/TheBloke/Llama-2-13B-chat-GGUF/resolve/main/llama-2-13b-chat.Q4_0.gguf" "url": "https://huggingface.co/TheBloke/Llama-2-13B-chat-GGUF/resolve/main/llama-2-13b-chat.Q4_0.gguf"
}, },
"3": { "3": {
"model": "Llama-2-7B-Chat-GGUF", "model": "Llama-2-7B-Chat-GGUF",
"url": "https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGUF/blob/main/llama-2-7b-chat.Q4_K_M.gguf" "url": "https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGUF/resolve/main/llama-2-7b-chat.Q4_K_M.gguf"
}, },
} }
_recommend_model_url_table_str = map(lambda id, info: f"\t{id}\t{info['model']}\t{info['url']}\n", _recommend_model_urls) _recommend_model_url_table_str = ""
for i in range(1, 999):
id = str(i)
info = _recommend_model_urls.get(id)
if info:
_recommend_model_url_table_str += f"\n\t{id}\t{info['model']}\t{info['url']}"
else:
break
_params = [ _params = [
BuildParameter("model_path", BuildParameterModelPath(), "Please input the model file path (Press 'Enter' if you need to download it)"), BuildParameter("model_path", BuildParameterModelPath(), "Please input the model file path (Press 'Enter' if you need to download it)"),
BuildParameter("model_url", BuildParameterModelUrl(), BuildParameter("model_url", BuildParameterModelUrl(), "Please input (default: Llama-2-70B-chat)", f"Now you need input the url to download the model, or you can input the 'ID' in the follow table to select one:\n\tID\tmodel\t\turl{_recommend_model_url_table_str}"),
f"""
Please input the url to download the model, or you can input the 'ID' in the follow table to select one:
ID\tmodel\turl
{_recommend_model_url_table_str}
Please input (default: Llama-2-70B-chat)
"""
),
BuildParameter("node_name", ParameterNodeNameApplier(), "Please input name for your node, and you can set it in 'llm_model_name' of 'agent.toml' (default: the name of the model file)"), BuildParameter("node_name", ParameterNodeNameApplier(), "Please input name for your node, and you can set it in 'llm_model_name' of 'agent.toml' (default: the name of the model file)"),
BuildParameter("port", ParameterPortApplier(), "Please input the port which the node server will listen on (default: random)"), BuildParameter("port", ParameterPortApplier(), "Please input the port which the node server will listen on (default: random)"),
BuildParameter("n_gpu_layers", ParameterNGpuLayersApplier(), "Please input layers offload to GPU (<=83 for Llama, 0 for CPU only, default: 83)"), BuildParameter("n_gpu_layers", ParameterNGpuLayersApplier(), "Please input layers offload to GPU (<=83 for Llama, 0 for CPU only, default: 83)"),