Home

Awesome

<!-- markdownlint-disable first-line-h1 --> <!-- markdownlint-disable html --> <!-- markdownlint-disable no-duplicate-header --> <div align="center"> <img src="./picture/1.jpg" width="40%" alt="Abacus" /> </div> <hr> <div align="center" style="line-height: 1;"> <!-- <a href="" target="_blank" style="margin: 2px;"> <img alt="Homepage" src="https://img.shields.io/badge/Abacus-Homepage-blue?style=flat-square&logo=homeadvisor" style="display: inline-block; vertical-align: middle;"/> </a> --> <!-- <a href="https://mp.weixin.qq.com/s/T24_U-aR1WuwQh9iDjCWCg" target="_blank" style="margin: 2px;"> <img alt="Blog" src="https://img.shields.io/badge/Abacus-blog-red?style=flat-square&logo=blogger" style="display: inline-block; vertical-align: middle;"/> </a> --> <a href="https://mp.weixin.qq.com/s/T24_U-aR1WuwQh9iDjCWCg" target="_blank" style="margin: 2px;"> <img alt="Wechat" src="https://img.shields.io/badge/Abacus-Wechat-%23368B13?logo=wechat&logoColor=%23368B13" style="display: inline-block; vertical-align: middle;"/> </a> <a href="https://github.com/HIT-SCIR/Abacus" target="_blank" style="margin: 2px;"> <img alt="Github" src="https://img.shields.io/badge/Abacus-GitHub-black?logo=github&logoColor=white" style="display: inline-block; vertical-align: middle;"/> </a> <a href="LICENSE" style="margin: 2px;"> <img alt="Code License" src="https://img.shields.io/badge/License-Apache_2.0-green.svg" style="display: inline-block; vertical-align: middle;"/> </a> </div>

1.引言

​从DeepMind发布的AlphaCode在竞赛级编程能力上超越人类平均水平之日起,代码大模型便广受关注。与此同时,OpenAI发布的CodeX更是展示出了代码大模型具有超越传统编程范畴的数值推理、逻辑推断、工具调用等高阶能力,进一步引爆了对该领域的研究与讨论。以BigCode StarCoder为代表的开源项目对完善该领域的研究生态做出了卓越的贡献。然而,目前开源代码大模型提升编程能力的同时会严重损害通用语言能力。为此,哈尔滨工业大学社会计算与信息检索研究中心(HIT-SCIR)推出了<strong>“珠算”代码大模型</strong>,其以2.7B参数在代码与通用语言平均性能上均超越了DeepSeek-Coder-1.3B、Yi-Coder-1.5B、Stable Code-3B、Granite-3B-Code等参数量3B及以下的代码大模型,希望通过开放权重、训练细节以及配套的微调适配平台与插件,助力开源社区的发展。

<p align="center"> <img width="60%" src="picture/3-1.png"> </p>

2.模型下载

<div align="center">
模型名称文件大小下载地址备注
Abacus5GB🤗HuggingFace<br>ModelScopeAbacus完整模型
Abacus-gguf1.7GB(Q4_K_M)<br>2.7GB(Q8_0)🤗HuggingFace<br>ModelScope珠算GGUF版本,适用于llama.cpp、Ollama等推理框架
</div>

3.模型评价

代码生成能力

模型代码生成能力的评估主要基于以下评测基准:

<div align="center">
模型名称HumanEvalHumanEval+MBPP(sanitized)MBPP+LiveCodeBenchAVG
Granite-3B-Code-Instruct45.7339.6353.7041.107.4637.52
Stable-Code-Instruct-3B67.0756.7157.2037.5911.4346.00
Yi-Coder-1.5B-Chat67.6860.3761.8748.378.2249.30
DeepSeek-Coder-1.3B-Instruct65.2459.1556.0345.367.0046.56
珠算71.9565.8557.9843.369.0649.64
</div>

在国内外3B以下代码大模型中,珠算大模型在五个主流代码评测基准上的综合表现达到最佳,各项指标均处于领先水平。其中,在Humaneval和Humaneval+基准上的表现尤为突出;在MBPP(sanitized)和MBPP+基准上的表现略逊于最新发布的Yi-Coder-1.5B-chat;而在LiveCodeBench基准上的表现仅次于Stable-Code-Instruct-3B。

3.2 通用语言能力

通用语言能力的评估主要基于以下评测基准:

<div align="center">
模型名称MMLUHellaSwagARC-eBBHC-EvalCMMLUGSM8KAVG
Granite-3B-Code-Instruct29.9526.8247.6235.8732.3030.7756.4837.12
Stable-Code-Instruct-3B29.3432.1534.7421.6928.6129.1815.9227.37
Yi-Coder-1.5B-Chat33.9828.5240.0434.4031.8831.8810.1630.12
DeepSeek-Coder-1.3B-Instruct26.6825.2527.697.4825.6126.889.6321.32
珠算40.1853.2366.6736.0836.0036.8446.3245.05
</div>

在国内外3B以下代码大模型中,珠算大模型在七个主流通用语言评测基准上的综合表现达到最佳,且具有明显优势。除在数学推理GSM8K基准上低于Granite-3B-Code-Instruct,其余各项指标均达到最优;通用语言能力与通用大模型MiniCPM-2B-sft-bf16还有一定差距,后续版本将对此进行强化,以此带来更自然、更流畅的对话,以及对用户需求更充分的理解,最终在自动化编程辅助、代码智能体领域有更加广阔的应用前景。

4.训练过程

预训练数据处理

<p align="center"> <img width="100%" src="./picture/2-1.PNG"> </p>

预训练策略

<p align="center"> <img width="50%" src="./picture/2-4.png"> </p> <p align="center"> <img width="50%" src="./picture/2-7.png"> </p>

面向代码的微调

5.模型使用

Quick Start

下载Ollama并启动Ollama service:

ollama serve

运行珠算大模型:

ollama run HIT-SCIR/abacus

Transformers 模型推理 + 流式生成

<details>

transformers支持为tokenizer添加聊天模板,并支持流式生成。示例代码如下:

# example/transformers-stream/stream.py

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, TextStreamer

model_id = "HIT-SCIR/abacus"

tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype=torch.bfloat16,
    device_map="auto",
    trust_remote_code=True,
)

chat = [
    {"role": "user", "content": "请你用python写一段快速排序的代码"},
]

inputs = tokenizer.apply_chat_template(
    chat,
    tokenize=True,
    add_generation_prompt=True,
    return_tensors="pt",
).to(0)

stream_output = model.generate(
    inputs,
    streamer=TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True),
    temperature=0.8,
    top_p=0.9,
    max_new_tokens=2048,
)
</details>

ModelScope 模型推理

<details>

ModelScope的接口与Transformers非常相似,只需将transformers替换为modelscope即可:

# example/modelscope-generate/generate.py

import torch
from modelscope import AutoTokenizer, AutoModelForCausalLM

model_id = "HIT-SCIR/abacus"

tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype=torch.bfloat16,
    device_map="auto",
    trust_remote_code=True,
)

text = "<用户>请你用python写一段快速排序的代码<AI>"

inputs = tokenizer(text, return_tensors="pt").to(0)
outputs = model.generate(
    **inputs,
    temperature=0.8,
    top_p=0.9,
    max_new_tokens=2048,
)
print(tokenizer.decode(outputs[0], skip_special_tokens=False))
</details>

vLLM 推理加速

<details>

珠算支持通过vLLM实现推理加速,示例代码如下:

# example/vllm-generate/generate.py

from vllm import LLM, SamplingParams

llm = LLM(
    model="HIT-SCIR/abacus",
    tensor_parallel_size=1,
    trust_remote_code=True,
)

sampling_params = SamplingParams(
    temperature=0.8, top_p=0.95, max_tokens=2048
)

prompts = [
    "<用户>请你用python写一段快速排序的代码<AI>",
]

outputs = llm.generate(prompts, sampling_params)

for output in outputs:
    prompt = output.prompt
    generated_text = output.outputs[0].text
    print(generated_text)
</details>

llama.cpp部署

<details>

GGUF格式旨在快速加载和保存模型,由llama.cpp团队推出,适用于llama.cpp、Ollama等框架。您可以手动将HuggingFace格式的珠算转换到GGUF格式。下面介绍使用llama.cpp转GGUF的方法和部署步骤。

Step 1 环境准备

首先需要下载llama.cpp的源码。

git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp

然后需要进行编译,推荐使用cmake。根据您的硬件平台,编译命令有细微差异:

# cpu
cmake -B build_cpu
cmake --build build_cpu --config Release

# cuda
cmake -B build_cuda -DGGML_CUDA=ON
cmake --build build_cuda --config Release -j 12
Step 2 格式转换(可选)

以下命令需要在llama.cpp/目录下: 转换为GGUF格式

python convert.py --outfile /path/to/Abacus.gguf /path/to/Abacus

进行GGUF格式的Q4_K_M量化,以下命令需要在llama.cpp/build_cpu/bin或者llama.cpp/build_cuda/bin目录下(依赖于编译的平台):

./llama-quantize /path/to/Abacus.gguf /path/to/Abacus-Q4_K_M.gguf Q4_K_M
Step 3 开始推理

以下命令需要在llama.cpp/build_cpu/bin或者llama.cpp/build_cuda/bin目录下(依赖于编译的平台):

./llama-cli -m /path/to/Abacus.gguf -p "<用户>帮我写一个快速排序代码<AI>" -n 128

关于main的更多参数,可以参考llama.cpp的官方文档

</details>

Ollama部署

<details>

GGUF格式模型同样可以使用Ollama部署。下面介绍简要步骤。

Step 1 环境准备

这里使用仓库release的压缩包来免root安装,更多安装方法可以参考Ollama官方的安装教程

wget https://github.com/ollama/ollama/releases/download/v0.3.10/ollama-linux-amd64.tgz
tar -C /path/to/ollama -xzf /path/to/ollama-linux-amd64.tgz
Step 2 导入模型
cd /path/to/ollama/bin

构建Modelfile,指定导入GGUF模型路径,其内容示例如下,更多参数设置可参考官方文档

FROM /path/to/Abacus.gguf

Ollama创建模型

./ollama create Abacus -f path/to/Modelfile
Step 3 使用模型

同样在path/to/ollama/bin路径下:

./ollama run Abacus
>>> <用户>帮我写一个快速排序代码<AI>
</details>

6.微调适配平台

模型微调功能

<p align="center"> <img width="100%" src="./picture/4-1-2.png"> </p> <p align="center"> <img width="100%" src="./picture/4-2-2.png"> </p>

模型评估功能

<p align="center"> <img width="100%" src="./picture/4-3-2.png"> </p>

模型推理功能

<p align="center"> <img width="100%" src="./picture/4-4-2.png"> </p> 微调适配平台将于测试完毕后发布。

7.VSCode插件

基于珠算大模型的编程能力,我们面向VSCode平台构建了编程辅助插件。插件可以一键式安装,支持代码生成、代码补全、代码摘要等功能,根据用户已经输入的内容预测后续的代码或注释,有效提高开发效率。

<p align="center"> <img width="100%" src="./picture/4-5.gif"> </p> 由于珠算大模型具有良好的中文理解能力,用户可以直接用中文写注释来表达需求。 <p align="center"> <img width="100%" src="./picture/4-6.gif"> </p> 插件将于测试完毕后在VSCode应用市场发布。

8.开源协议

对本仓库源码的使用遵循开源许可协议 Apache 2.0

珠算支持商用。如果将珠算模型或其衍生品用作商业用途,请您按照如下方式联系许可方,以进行登记并向许可方申请书面授权:联系邮箱:jngao@ir.hit.edu.cn