论文 | 模型 | 在线体验 | VSCode 插件 | 聊天演示
💫 StarCoder 是一个在源代码和自然语言文本上训练的语言模型。其训练数据涵盖了超过 80 种不同的编程语言,以及从 GitHub 议题、提交记录和 Notebook 中提取的文本。本仓库展示了如何快速了解该模型的能力。
chat/ 目录获取训练代码,并在此在线体验。在使用模型前,请访问 hf.co/bigcode/starcoder 并接受使用协议。同时,请确保您已登录 Hugging Face Hub:
huggingface-cli login
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 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
安装 transformers 和 peft:
conda install -c huggingface transformers
pip install git+https://github.com/huggingface/peft.git
注意,您也可以通过以下方式安装 transformers 的最新稳定版本:
pip install git+https://github.com/huggingface/transformers
安装 datasets、accelerate 和 huggingface_hub:
conda install -c huggingface -c conda-forge datasets
conda install -c conda-forge accelerate
conda install -c conda-forge huggingface_hub
最后,安装 bitsandbytes 和 wandb:
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 是一个知名的问答网站网络,涵盖多个领域。用户可以在该平台提问并从其他用户处获得答案。这些答案会根据其质量进行评分和排名。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 训练模型,并且想要运行推理/评估,则需要将适配器层与基础模型合并。为此,请运行:
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++ 实现。