AI00 Server
是一个基于RWKV
模型的推理API服务器。
AI00 Server
基于 WEB-RWKV
推理引擎进行开发。
支持Vulkan
/Dx12
/OpenGL
作为推理后端,无需臃肿的pytorch
、CUDA
等运行环境,小巧身材,开箱即用!
兼容OpenAI的ChatGPT API接口。
100% 开源可商用,采用MIT协议。
如果你是想要在自己的应用程序中内嵌一个LLM,且对用户的机器要求不那么苛刻(6GB以上GRAM的显卡), AI00 Server
无疑是一个很好的选择。
立即加入AI00 RWKV Server
社区,体验AI的魅力!
交流QQ群:30920262
你必须下载模型并将其放置在assets/models
中。
-
直接从 Release 下载最新版本
-
下载模型后把模型放在
assets/models/
路径,例如assets/models/RWKV-x060-World-3B-v2-20240228-ctx4096.st
-
你可以修改
assets/configs/Config.toml
里面的模型配置,包括模型路径、量化层数等 -
在命令行运行
./ai00_rwkv_server
-
打开浏览器,访问WebUI http://localhost:65530(如果开启了`tls`,访问 https://localhost:65530)
-
克隆本仓库
git clone https://github.com/cgisky1980/ai00_rwkv_server.git cd ai00_rwkv_server
-
下载模型后把模型放在
assets/models/
路径下,例如assets/models/RWKV-x060-World-3B-v2-20240228-ctx4096.st
-
编译
cargo build --release
-
编译完成后运行
cargo run --release
-
打开浏览器,访问WebUI http://localhost:65530(如果开启了`tls`,访问 https://localhost:65530)
本项目目前仅支持.st
后缀的 Safetensors 模型,通过torch
保存的.pth
后缀模型需要在使用前进行转换。
-
克隆或下载本仓库下convert_ai00.py或convert_safetensors.py程序,并安装相应的依赖库(
torch
和safetensors
) -
运行上述程序,并指定输入输出路径
$ python assets/scripts/convert_safetensors.py --input ./filename.pth --output ./filename.st
-
如果你不想安装 Python 或 Torch,可以前往
web-rwkv
并下载不依赖于 Python 或 Torch 的转换器web-rwkv-converter
$ ./web-rwkv-converter --input /path/to/model.pth --output /path/to/model.st
-
根据上文步骤,将转换所得的
.st
模型文件放在assets/models/
路径下,并修改assets/configs/Config.toml
中的模型路径
--config
: 模型配置文件路径(默认assets/configs/Config.toml
)--ip
: 服务器绑定的IP地址--port
: 运行端口
API 服务开启于 65530 端口, 数据输入输出格式遵循 Openai API 规范。
有一些 API,比如chat
和completions
有一些可选的额外字段,这些额外字段是为高级功能准备的。可以访问 http://localhost:65530/api-docs 查看具体的 API 参数。
/api/oai/v1/models
/api/oai/models
/api/oai/v1/chat/completions
/api/oai/chat/completions
/api/oai/v1/completions
/api/oai/completions
/api/oai/v1/embeddings
/api/oai/embeddings
下面是一个 Python 的 Ai00 API 调用示例,开箱即用:
import openai
class Ai00:
def __init__(self,model="model",port=65530,api_key="JUSTSECRET_KEY") :
openai.api_base = f"http://127.0.0.1:{port}/api/oai"
openai.api_key = api_key
self.ctx = []
self.params = {
"system_name": "System",
"user_name": "User",
"assistant_name": "Assistant",
"model": model,
"max_tokens": 4096,
"top_p": 0.6,
"temperature": 1,
"presence_penalty": 0.3,
"frequency_penalty": 0.3,
"half_life": 400,
"stop": ['\x00','\n\n']
}
def set_params(self,**kwargs):
self.params.update(kwargs)
def clear_ctx(self):
self.ctx = []
def get_ctx(self):
return self.ctx
def continuation(self, message):
response = openai.Completion.create(
model=self.params['model'],
prompt=message,
max_tokens=self.params['max_tokens'],
half_life=self.params['half_life'],
top_p=self.params['top_p'],
temperature=self.params['temperature'],
presence_penalty=self.params['presence_penalty'],
frequency_penalty=self.params['frequency_penalty'],
stop=self.params['stop']
)
result = response.choices[0].text
return result
def append_ctx(self,role,content):
self.ctx.append({
"role": role,
"content": content
})
def send_message(self, message,role="user"):
self.ctx.append({
"role": role,
"content": message
})
result = openai.ChatCompletion.create(
model=self.params['model'],
messages=self.ctx,
names={
"system": self.params['system_name'],
"user": self.params['user_name'],
"assistant": self.params['assistant_name']
},
max_tokens=self.params['max_tokens'],
half_life=self.params['half_life'],
top_p=self.params['top_p'],
temperature=self.params['temperature'],
presence_penalty=self.params['presence_penalty'],
frequency_penalty=self.params['frequency_penalty'],
stop=self.params['stop']
)
result = result.choices[0].message['content']
self.ctx.append({
"role": "assistant",
"content": result
})
return result
ai00 = Ai00()
ai00.set_params(
max_tokens = 4096,
top_p = 0.55,
temperature = 2,
presence_penalty = 0.3,
frequency_penalty = 0.8,
half_life = 400,
stop = ['\x00','\n\n']
)
print(ai00.send_message("how are you?"))
print(ai00.send_message("me too!"))
print(ai00.get_ctx())
ai00.clear_ctx()
print(ai00.continuation("i like"))
从 v0.5 开始 Ai00 有了一个独特功能:BNF 采样。这个采样法通过限定模型能够选择的 tokens 来使得模型强行输出符合一定格式的文本(比如 JSON 或者 Markdown 等等)。
以下是一个强行让模型输出有 "name"、"age" 和 "job" 字段的 JSON 的 BNF:
<start> ::= <json_object>
<json_object> ::= "{" <object_members> "}"
<object_members> ::= <json_member> | <json_member> ", " <object_members>
<json_member> ::= <json_key> ": " <json_value>
<json_key> ::= '"' "name" '"' | '"' "age" '"' | '"' "job" '"'
<json_value> ::= <json_string> | <json_number>
<json_string>::='"'<content>'"'
<content>::=<except!([escaped_literals])>|<except!([escaped_literals])><content>|'\\"'<content>|'\\"'
<escaped_literals>::='\t'|'\n'|'\r'|'"'
<json_number> ::= <positive_digit><digits>|'0'
<digits>::=<digit>|<digit><digits>
<digit>::='0'|<positive_digit>
<positive_digit>::="1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
- 支持
text_completions
和chat_completions
- 支持
sse
推送 - 集成基本的调用前端
-
Batch serve
并行推理 -
int8
量化支持 -
nf4
量化支持 -
LoRA
模型支持 - 支持加载微调的初始状态
-
LoRA
模型热加载、切换 - 初始状态动态加载、切换
- BNF采样
我们一直在寻找有兴趣帮助我们改进项目的人。如果你对以下任何一项感兴趣,请加入我们!
- 💀编写代码
- 💬提供反馈
- 🔆提出想法或需求
- 🔍测试新功能
- ✏翻译文档
- 📣推广项目
- 🏅其他任何会对我们有所帮助的事
无论你的技能水平如何,我们都欢迎你加入我们。你可以通过以下方式加入我们:
- 加入我们的 Discord 频道
- 加入我们的 QQ 群
- 在 GitHub 上提交问题或拉取请求
- 在我们的网站上留下反馈
我们迫不及待地想与你合作,让这个项目变得更好!希望项目对你有帮助!
顾真牛 📖 💻 🖋 🎨 🧑🏫 |
研究社交 💻 💡 🤔 🚧 👀 📦 |
josc146 🐛 💻 🤔 🔧 |
l15y 🔧 🔌 💻 |
我们很感激您的帮助,我们很高兴能与您合作。