Skip to content

Latest commit

 

History

History
356 lines (254 loc) · 13.1 KB

README.zh.md

File metadata and controls

356 lines (254 loc) · 13.1 KB

💯AI00 Server

license Rust Version PRs welcome

All Contributors

en zh


AI00 Server是一个基于RWKV模型的推理API服务器。

AI00 Server基于 WEB-RWKV推理引擎进行开发。

支持Vulkan/Dx12/OpenGL作为推理后端,无需臃肿的pytorchCUDA等运行环境,小巧身材,开箱即用!

兼容OpenAI的ChatGPT API接口。

100% 开源可商用,采用MIT协议。

如果你是想要在自己的应用程序中内嵌一个LLM,且对用户的机器要求不那么苛刻(6GB以上GRAM的显卡), AI00 Server无疑是一个很好的选择。

立即加入AI00 RWKV Server社区,体验AI的魅力!

交流QQ群:30920262

⭕模型下载和转换

你必须下载模型并将其放置在assets/models中。

你可以在这里下载已经转换好的模型: V5 或者 V6

安装、编译和使用

📦直接下载安装

  1. 直接从 Release 下载最新版本

  2. 下载模型后把模型放在assets/models/路径,例如assets/models/RWKV-x060-World-3B-v2-20240228-ctx4096.st

  3. 你可以修改 assets/configs/Config.toml 里面的模型配置,包括模型路径、量化层数等

  4. 在命令行运行

    ./ai00_rwkv_server
  5. 打开浏览器,访问WebUI http://localhost:65530(如果开启了`tls`,访问 https://localhost:65530)

📜从源码编译

  1. 安装Rust

  2. 克隆本仓库

    git clone https://github.com/cgisky1980/ai00_rwkv_server.git
    cd ai00_rwkv_server
  3. 下载模型后把模型放在 assets/models/路径下,例如assets/models/RWKV-x060-World-3B-v2-20240228-ctx4096.st

  4. 编译

    cargo build --release
  5. 编译完成后运行

    cargo run --release
  6. 打开浏览器,访问WebUI http://localhost:65530(如果开启了`tls`,访问 https://localhost:65530)

📒模型转换

本项目目前仅支持.st后缀的 Safetensors 模型,通过torch保存的.pth后缀模型需要在使用前进行转换。

  1. 下载pth模型

  2. 克隆或下载本仓库下convert2ai00.pyconvert_safetensors.py程序,并安装相应的依赖库(torchsafetensors

  3. 运行上述程序,并指定输入输出路径

    $ python convert_safetensors.py --input ./filename.pth --output ./filename.st
  4. 如果你不想安装 Python 或 Torch,可以前往web-rwkv并下载不依赖于 Python 或 Torch 的转换器web-rwkv-converter

    $ ./web-rwkv-converter --input /path/to/model.pth --output /path/to/model.st
  5. 根据上文步骤,将转换所得的.st模型文件放在assets/models/路径下,并修改 assets/Config.toml 中的模型路径

📝支持的启动参数

  • --config: 模型配置文件路径(默认assets/Config.toml
  • --ip: 服务器绑定的IP地址
  • --port: 运行端口

📙目前可用的API

API 服务开启于 65530 端口, 数据输入输出格式遵循 Openai API 规范。 有一些 API,比如chatcompletions有一些可选的额外字段,这些额外字段是为高级功能准备的。可以访问 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"))

BNF 采样

从 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"

📙WebUI 截图

对话功能

续写功能

写论文功能

📝TODO List

  • 支持text_completionschat_completions
  • 支持sse推送
  • 集成基本的调用前端
  • Batch serve并行推理
  • int8量化支持
  • nf4量化支持
  • LoRA模型支持
  • 支持加载微调的初始状态
  • LoRA模型热加载、切换
  • 初始状态动态加载、切换
  • BNF采样

👥Join Us

我们一直在寻找有兴趣帮助我们改进项目的人。如果你对以下任何一项感兴趣,请加入我们!

  • 💀编写代码
  • 💬提供反馈
  • 🔆提出想法或需求
  • 🔍测试新功能
  • ✏翻译文档
  • 📣推广项目
  • 🏅其他任何会对我们有所帮助的事

无论你的技能水平如何,我们都欢迎你加入我们。你可以通过以下方式加入我们:

  • 加入我们的 Discord 频道
  • 加入我们的 QQ 群
  • 在 GitHub 上提交问题或拉取请求
  • 在我们的网站上留下反馈

我们迫不及待地想与你合作,让这个项目变得更好!希望项目对你有帮助!

Thanks

cryscan 感谢cryscan的辛勤付出,为项目做出了杰出的贡献。

感谢下面项目的编写者们做出的杰出工作

顾真牛
顾真牛

📖 💻 🖋 🎨 🧑‍🏫
研究社交
研究社交

💻 💡 🤔 🚧 👀 📦
josc146
josc146

🐛 💻 🤔 🔧
l15y
l15y

🔧 🔌 💻

感谢下面又好看又有眼光又优秀的杰出人士对项目的支持和无私奉献

  • 来自 QQ 群

    image

  • 来自 Github

  • 来自 Discord

我们很感激您的帮助,我们很高兴能与您合作。

Stargazers over time

Stargazers over time