OA0
OA0 是一个探索 AI 的社区
现在注册
已注册用户请  登录
OA0  ›  代码  ›  StarCoder — 开源代码大模型

StarCoder — 开源代码大模型

 
  forge ·  2025-12-25 15:35:50 · 13 次点击  · 0 条评论  

💫 StarCoder

论文 | 模型 | 在线体验 | VSCode 插件 | 聊天演示

项目简介

💫 StarCoder 是一个在源代码和自然语言文本上训练的语言模型。其训练数据涵盖了超过 80 种不同的编程语言,以及从 GitHub 议题、提交记录和 Notebook 中提取的文本。本仓库展示了如何快速了解该模型的能力。

最新动态

  • 2023年5月9日: 我们已将 StarCoder 微调为一个有用的编程助手 💬!请查看 chat/ 目录获取训练代码,并在此在线体验

使用须知

在使用模型前,请访问 hf.co/bigcode/starcoder 并接受使用协议。同时,请确保您已登录 Hugging Face Hub:

huggingface-cli login

目录

  1. 快速开始
  2. 微调
  3. 评估
  4. 推理硬件要求

快速开始

StarCoder 在 GitHub 代码上进行训练,因此可用于执行代码生成任务。具体来说,该模型可以补全函数的实现或推断代码行中的后续字符。这可以借助 🤗 的 transformers 库来完成。

安装

首先,我们需要安装 requirements.txt 中列出的所有库。

pip install -r requirements.txt

代码生成

代码生成流程如下:

from transformers import AutoModelForCausalLM, AutoTokenizer

checkpoint = "bigcode/starcoder"
device = "cuda" # 使用 GPU,或 "cpu" 使用 CPU

tokenizer = AutoTokenizer.from_pretrained(checkpoint)
# 为节省内存,可考虑指定 torch_dtype=torch.float16 等使用 fp16 或 bf16
model = AutoModelForCausalLM.from_pretrained(checkpoint).to(device)

inputs = tokenizer.encode("def print_hello_world():", return_tensors="pt").to(device)
outputs = model.generate(inputs)
# clean_up_tokenization_spaces=False 可防止分词器在某些边缘情况下移除标点周围的空格
print(tokenizer.decode(outputs[0], clean_up_tokenization_spaces=False))

或者

from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
checkpoint = "bigcode/starcoder"

model = AutoModelForCausalLM.from_pretrained(checkpoint)
tokenizer = AutoTokenizer.from_pretrained(checkpoint)

pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, device=0)
print( pipe("def hello():") )

关于硬件要求,请查看章节 推理硬件要求

文本生成推理

docker run -p 8080:80 -v $PWD/data:/data -e HUGGING_FACE_HUB_TOKEN=<你的已启用 BigCode 的令牌> -d  ghcr.io/huggingface/text-generation-inference:latest --model-id bigcode/starcoder --max-total-tokens 8192

更多详情,请参阅此处

微调

这里,我们展示如何针对特定的下游任务对此语言模型进行微调。

使用 conda 逐步安装

创建一个新的 conda 环境并激活它:

conda create -n env
conda activate env

安装与您的 CUDA 版本兼容的 pytorch 版本,请参考此链接。例如,以下命令适用于 CUDA 11.6:

conda install pytorch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 pytorch-cuda=11.6 -c pytorch -c nvidia

安装 transformerspeft

conda install -c huggingface transformers
pip install git+https://github.com/huggingface/peft.git

注意,您也可以通过以下方式安装 transformers 的最新稳定版本:

pip install git+https://github.com/huggingface/transformers

安装 datasetsacceleratehuggingface_hub

conda install -c huggingface -c conda-forge datasets
conda install -c conda-forge accelerate
conda install -c conda-forge huggingface_hub

最后,安装 bitsandbyteswandb

pip install bitsandbytes
pip install wandb

要获取任何脚本的完整参数列表及描述,可以运行以下命令:

python scripts/some_script.py --help

在运行任何脚本之前,请确保您已登录并可以推送到 Hub:

huggingface-cli login

确保您已登录 wandb

wandb login

完成以上所有步骤后,您可以克隆此仓库并进入相应目录。

数据集

💫 StarCoder 可以通过微调来完成多种下游任务。我们这里的兴趣是微调 StarCoder,使其能够遵循指令。指令微调 最近备受关注,它提出了一个简单的框架,教导语言模型使其输出与人类需求对齐。该过程需要高质量的指令数据集,其中包含多个 指令 - 答案 对。遗憾的是,这类数据集并不普遍,但得益于 Hugging Face 🤗 的 datasets 库,我们可以获得一些不错的替代品。为了高效且低成本地进行微调,我们使用了 Hugging Face 🤗 的 PEFT 以及 Tim Dettmers 的 bitsandbytes

Stack Exchange SE

Stack Exchange 是一个知名的问答网站网络,涵盖多个领域。用户可以在该平台提问并从其他用户处获得答案。这些答案会根据其质量进行评分和排名。Stack exchange instruction 数据集通过抓取该网站构建,收集了大量问答对。然后可以在此数据集上微调语言模型,使其具备强大且多样的问题解答能力。

要执行微调脚本,请运行以下命令:

python finetune/finetune.py \
  --model_path="bigcode/starcoder"\
  --dataset_name="ArmelR/stack-exchange-instruction"\
  --subset="data/finetune"\
  --split="train"\
  --size_valid_set 10000\
  --streaming\
  --seq_length 2048\
  --max_steps 1000\
  --batch_size 1\
  --input_column_name="question"\
  --output_column_name="response"\ 
  --gradient_accumulation_steps 16\
  --learning_rate 1e-4\
  --lr_scheduler_type="cosine"\
  --num_warmup_steps 100\
  --weight_decay 0.05\
  --output_dir="./checkpoints" \

使用流式传输时,SE 数据集的大小更易于管理。我们还需要指定所使用的数据集划分。更多详情,请查看 🤗 上的数据集页面。同样,我们可以修改命令以适应 GPU 的可用性:

python -m torch.distributed.launch \
  --nproc_per_node number_of_gpus finetune/finetune.py \
  --model_path="bigcode/starcoder"\
  --dataset_name="ArmelR/stack-exchange-instruction"\
  --subset="data/finetune"\
  --split="train"\
  --size_valid_set 10000\
  --streaming \
  --seq_length 2048\
  --max_steps 1000\
  --batch_size 1\
  --input_column_name="question"\
  --output_column_name="response"\ 
  --gradient_accumulation_steps 16\
  --learning_rate 1e-4\
  --lr_scheduler_type="cosine"\
  --num_warmup_steps 100\
  --weight_decay 0.05\
  --output_dir="./checkpoints" \

合并 PEFT 适配器层

如果您使用 PEFT 训练模型,并且想要运行推理/评估,则需要将适配器层与基础模型合并。为此,请运行:

python finetune/merge_peft_adapters.py --base_model_name_or_path model_to_merge --peft_model_path model_checkpoint

# 将合并后的模型推送到 Hub
python finetune/merge_peft_adapters.py --base_model_name_or_path model_to_merge --peft_model_path model_checkpoint --push_to_hub

例如:

python finetune/merge_peft_adapters.py --model_name_or_path bigcode/starcoder --peft_model_path checkpoints/checkpoint-1000 --push_to_hub

评估

要评估 StarCoder 及其衍生模型,您可以使用 BigCode-Evaluation-Harness 来评估代码大语言模型。

推理硬件要求

在 FP32 精度下,模型需要超过 60GB 的 RAM。您可以在约 30GB 内存下以 FP16 或 BF16 精度加载,或在 8 位量化下使用不到 20GB 内存加载:

# 确保已安装 accelerate 和 bitsandbytes
from transformers import AutoModelForCausalLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("bigcode/starcoder")
# 对于 fp16,将 `load_in_8bit=True` 替换为 `torch_dtype=torch.float16`
model = AutoModelForCausalLM.from_pretrained("bigcode/starcoder", device_map="auto", load_in_8bit=True)
print(f"内存占用: {model.get_memory_footprint() / 1e6:.2f} MB")
````

内存占用: 15939.61 MB
```
您也可以尝试 starcoder.cpp,这是一个使用 ggml 库的 C++ 实现。

13 次点击  ∙  0 人收藏  
登录后收藏  
0 条回复
关于 ·  帮助 ·  PING ·  隐私政策 ·  服务条款   
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
耗时 27 ms
Developed with Cursor