Views
No views yet

| 章节 | 说明 |
|---|---|
| 💁🏻♂ 开源清单 | 本仓库开源项目清单 |
| 💡 模型介绍 | 简要介绍活字模型结构和训练过程 |
| 📥 模型下载 | 活字模型下载链接 |
| 💻 模型推理 | 活字模型推理样例,包括vLLM推理加速、llama.cpp量化推理等框架的使用流程 |
| 📈 模型性能 | 活字模型在主流评测任务上的性能 |
| 🗂 生成样例 | 活字模型实际生成效果样例 |

[!IMPORTANT] 活字系列模型仍然可能生成包含事实性错误的误导性回复或包含偏见/歧视的有害内容,请谨慎鉴别和使用生成的内容,请勿将生成的有害内容传播至互联网。

| 模型名称 | 文件大小 | 下载地址 | 备注 |
|---|---|---|---|
| huozi3 | 88GB | 🤗HuggingFace ModelScope | 活字3.0 完整模型 |
| huozi3-gguf | 25GB | 🤗HuggingFace ModelScope | 活字3.0 GGUF版本,适用于llama.cpp等推理框架 |
| huozi3-awq | 24GB | 🤗HuggingFace ModelScope | 活字3.0 AWQ版本,适用于AutoAWQ等推理框架 |
<|beginofutterance|>系统
{system prompt}<|endofutterance|>
<|beginofutterance|>用户
{input}<|endofutterance|>
<|beginofutterance|>助手
{output}<|endofutterance|>1# quickstart.py
2
3import torch
4from transformers import AutoModelForCausalLM, AutoTokenizer
5
6model_id = "HIT-SCIR/huozi3"
7
8tokenizer = AutoTokenizer.from_pretrained(model_id)
9model = AutoModelForCausalLM.from_pretrained(
10 model_id,
11 attn_implementation="flash_attention_2",
12 torch_dtype=torch.bfloat16,
13 device_map="auto",
14)
15
16text = """<|beginofutterance|>系统
17你是一个智能助手<|endofutterance|>
18<|beginofutterance|>用户
19请你用python写一段快速排序的代码<|endofutterance|>
20<|beginofutterance|>助手
21"""
22
23inputs = tokenizer(text, return_tensors="pt").to(0)
24
25outputs = model.generate(
26 **inputs,
27 eos_token_id=57001,
28 temperature=0.8,
29 top_p=0.9,
30 max_new_tokens=2048,
31)
32print(tokenizer.decode(outputs[0], skip_special_tokens=False))1# example/transformers-stream/stream.py
2
3import torch
4from transformers import AutoModelForCausalLM, AutoTokenizer, TextStreamer
5
6model_id = "HIT-SCIR/huozi3"
7
8model = AutoModelForCausalLM.from_pretrained(
9 model_id,
10 attn_implementation="flash_attention_2",
11 torch_dtype=torch.bfloat16,
12 device_map="auto",
13)
14
15tokenizer = AutoTokenizer.from_pretrained(model_id)
16tokenizer.chat_template = """{% for message in messages %}{{'<|beginofutterance|>' + message['role'] + '\n' + message['content']}}{% if (loop.last and add_generation_prompt) or not loop.last %}{{ '<|endofutterance|>' + '\n'}}{% endif %}{% endfor %}
17{% if add_generation_prompt and messages[-1]['role'] != '助手' %}{{ '<|beginofutterance|>助手\n' }}{% endif %}"""
18
19chat = [
20 {"role": "系统", "content": "你是一个智能助手"},
21 {"role": "用户", "content": "请你用python写一段快速排序的代码"},
22]
23
24inputs = tokenizer.apply_chat_template(
25 chat,
26 tokenize=True,
27 add_generation_prompt=True,
28 return_tensors="pt",
29).to(0)
30
31stream_output = model.generate(
32 inputs,
33 streamer=TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True),
34 eos_token_id=57001,
35 temperature=0.8,
36 top_p=0.9,
37 max_new_tokens=2048,
38)1# example/modelscope-generate/generate.py
2
3import torch
4- from transformers import AutoModelForCausalLM, AutoTokenizer
5+ from modelscope import AutoTokenizer, AutoModelForCausalLM
6
7model_id = "HIT-SCIR/huozi3"
8
9tokenizer = AutoTokenizer.from_pretrained(model_id)
10model = AutoModelForCausalLM.from_pretrained(
11 model_id,
12 attn_implementation="flash_attention_2",
13 torch_dtype=torch.bfloat16,
14 device_map="auto",
15)
16
17text = """<|beginofutterance|>系统
18你是一个智能助手<|endofutterance|>
19<|beginofutterance|>用户
20请你用python写一段快速排序的代码<|endofutterance|>
21<|beginofutterance|>助手
22"""
23
24inputs = tokenizer(text, return_tensors="pt").to(0)
25
26outputs = model.generate(
27 **inputs,
28 eos_token_id=57001,
29 temperature=0.8,
30 top_p=0.9,
31 max_new_tokens=2048,
32)
33print(tokenizer.decode(outputs[0], skip_special_tokens=False))1# example/vllm-generate/generate.py
2
3from vllm import LLM, SamplingParams
4
5prompts = [
6 """<|beginofutterance|>系统
7你是一个智能助手<|endofutterance|>
8<|beginofutterance|>用户
9请你用python写一段快速排序的代码<|endofutterance|>
10<|beginofutterance|>助手
11""",
12]
13
14sampling_params = SamplingParams(
15 temperature=0.8, top_p=0.95, stop_token_ids=[57001], max_tokens=2048
16)
17llm = LLM(
18 model="HIT-SCIR/huozi3",
19 tensor_parallel_size=4,
20)
21outputs = llm.generate(prompts, sampling_params)
22
23for output in outputs:
24 prompt = output.prompt
25 generated_text = output.outputs[0].text
26 print(generated_text)$ pip install vllm openai$ python -m vllm.entrypoints.openai.api_server --model /path/to/huozi3/checkpoint --served-model-name huozi --chat-template template.jinja --tensor-parallel-size 8 --response-role 助手 --max-model-len 20481# example/openai-api/openai-client.py
2
3from openai import OpenAI
4
5openai_api_key = "EMPTY"
6openai_api_base = "http://localhost:8000/v1"
7
8client = OpenAI(
9 api_key=openai_api_key,
10 base_url=openai_api_base,
11)
12
13chat_response = client.chat.completions.create(
14 model="huozi",
15 messages=[
16 {"role": "系统", "content": "你是一个智能助手"},
17 {"role": "用户", "content": "请你用python写一段快速排序的代码"},
18 ],
19 extra_body={"stop_token_ids": [57001]},
20)
21print("Chat response:", chat_response.choices[0].message.content)1# example/openai-api/openai-client-gradio.py
2
3from openai import OpenAI
4import gradio as gr
5
6openai_api_key = "EMPTY"
7openai_api_base = "http://localhost:8000/v1"
8
9client = OpenAI(
10 api_key=openai_api_key,
11 base_url=openai_api_base,
12)
13
14
15def predict(message, history):
16 history_openai_format = [
17 {"role": "系统", "content": "你是一个智能助手"},
18 ]
19 for human, assistant in history:
20 history_openai_format.append({"role": "用户", "content": human})
21 history_openai_format.append({"role": "助手", "content": assistant})
22 history_openai_format.append({"role": "用户", "content": message})
23 models = client.models.list()
24
25 stream = client.chat.completions.create(
26 model=models.data[0].id,
27 messages=history_openai_format,
28 temperature=0.8,
29 stream=True,
30 extra_body={"repetition_penalty": 1, "stop_token_ids": [57001]},
31 )
32
33 partial_message = ""
34 for chunk in stream:
35 partial_message += chunk.choices[0].delta.content or ""
36 yield partial_message
37
38
39gr.ChatInterface(predict).queue().launch()| 量化方法 | 显存占用 |
|---|---|
| 无 | 95GB |
| AWQ | 32GB |
| GGUF(q4_0) | 28GB |
| GGUF(q2_k) | 18GB |
| GGUF(q2_k, offload 16层) | 9.6GB |
1$ git clone --recurse-submodules https://github.com/HIT-SCIR/huozi
2$ cd examples/llama.cpp1$ git clone https://github.com/ggerganov/llama.cpp.git
2$ cd llama.cpp1$ make # 用于纯CPU推理
2$ make LLAMA_CUBLAS=1 # 用于GPU推理
3$ LLAMA_METAL=1 make # 用于Apple Silicon,暂未经过测试llama.cpp/目录下:1# 转换为GGUF格式
2$ python convert.py --outfile /path/to/huozi-gguf/huozi3.gguf /path/to/huozi3
3# 进行GGUF格式的q4_0量化
4$ quantize /path/to/huozi-gguf/huozi3.gguf /path/to/huozi-gguf/huozi3-q4_0.gguf q4_0llama.cpp/目录下:$ main -m /path/to/huozi-gguf/huozi3-q4_0.gguf --color --interactive-first -c 2048 -t 6 --temp 0.2 --repeat_penalty 1.1 -ngl 999 --in-prefix "<|beginofutterance|>用户\n" --in-suffix "<|endofutterance|>\n<|beginofutterance|>助手" -r "<|endofutterance|>"-ngl参数表示向GPU中offload的层数,降低这个值可以缓解GPU显存压力。经过我们的实际测试,q2_k量化的模型offload 16层,显存占用可降低至9.6GB,可在消费级GPU上运行模型:$ main -m /path/to/huozi-gguf/huozi3-q2_k.gguf --color --interactive-first -c 2048 -t 6 --temp 0.2 --repeat_penalty 1.1 -ngl 16 --in-prefix "<|beginofutterance|>用户\n" --in-suffix "<|endofutterance|>\n<|beginofutterance|>助手" -r "<|endofutterance|>"main的更多参数,可以参考llama.cpp的官方文档。1# example/autoawq-generate/quant.py
2
3from awq import AutoAWQForCausalLM
4from transformers import AutoTokenizer
5
6model_path = "/path/to/huozi3"
7quant_path = "/path/to/save/huozi3-awq"
8modules_to_not_convert = ["gate"]
9quant_config = {
10 "zero_point": True,
11 "q_group_size": 128,
12 "w_bit": 4,
13 "version": "GEMM",
14 "modules_to_not_convert": modules_to_not_convert,
15}
16
17model = AutoAWQForCausalLM.from_pretrained(
18 model_path,
19 safetensors=True,
20 **{"low_cpu_mem_usage": True},
21)
22tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
23
24model.quantize(
25 tokenizer,
26 quant_config=quant_config,
27 modules_to_not_convert=modules_to_not_convert,
28)
29
30model.save_quantized(quant_path)
31tokenizer.save_pretrained(quant_path)
32
33print(f'Model is quantized and saved at "{quant_path}"')1# example/autoawq-generate/generate.py
2
3import torch
4+ from awq import AutoAWQForCausalLM
5from transformers import AutoTokenizer, TextStreamer
6
7
8- model_id = "HIT-SCIR/huozi3"
9+ model_id = "HIT-SCIR/huozi3-awq" # or model_id = "/path/to/saved/huozi3-awq"
10
11+ model = AutoAWQForCausalLM.from_quantized(model_id, fuse_layers=True)
12- model = AutoModelForCausalLM.from_pretrained(
13- model_id,
14- attn_implementation="flash_attention_2",
15- torch_dtype=torch.bfloat16,
16- device_map="auto",
17- )
18
19tokenizer = AutoTokenizer.from_pretrained(model_id)
20tokenizer.chat_template = """{% for message in messages %}{{'<|beginofutterance|>' + message['role'] + '\n' + message['content']}}{% if (loop.last and add_generation_prompt) or not loop.last %}{{ '<|endofutterance|>' + '\n'}}{% endif %}{% endfor %}
21{% if add_generation_prompt and messages[-1]['role'] != '助手' %}{{ '<|beginofutterance|>助手\n' }}{% endif %}"""
22
23chat = [
24 {"role": "系统", "content": "你是一个智能助手"},
25 {"role": "用户", "content": "请你用python写一段快速排序的代码"},
26]
27
28inputs = tokenizer.apply_chat_template(
29 chat,
30 tokenize=True,
31 add_generation_prompt=True,
32 return_tensors="pt",
33).to(0)
34
35stream_output = model.generate(
36 inputs,
37 streamer=TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True),
38 eos_token_id=57001,
39 temperature=0.8,
40 top_p=0.9,
41 max_new_tokens=2048,
42)








1@misc{huozi,
2 author = {Huozi-Team}.
3 title = {Huozi: Leveraging Large Language Models for Enhanced Open-Domain Chatting}
4 year = {2024},
5 publisher = {GitHub},
6 journal = {GitHub repository}
7 howpublished = {\url{https://github.com/HIT-SCIR/huozi}}
8}