许可证: cc-by-sa-4.0
数据集:
- bigcode/the-stack-dedup
标签:
- 代码
语言:
- 代码
编程语言:
- Markdown
- Java
- JavaScript
- Python
- TypeScript
- PHP
- SQL
- JSX
- reStructuredText
- Rust
- C
- CSS
- Go
- C++
- HTML
- Vue
- Ruby
- Jupyter Notebook
- R
- Shell
模型索引:
- 名称: replit-code-v1-3b
结果:
- 任务:
名称: 代码生成
类型: code-generation
数据集:
名称: "HumanEval"
类型: openai_humaneval
指标:
- 名称: pass@1
类型: pass@1
值: 0.219
验证: false
replit-code-v1-3b
由 Replit, Inc. 开发
🧑💻 在我们的演示空间测试!🧑💻
⚙️ 微调和指令调优指南 ⚙️
模型描述
replit-code-v1-3b
是一个专注于代码补全的 27 亿参数因果语言模型。该模型基于 Stack Dedup v1.2 数据集 的子集训练而成。
训练数据包含20种不同语言,按 token 数量降序排列如下:
Markdown
、Java
、JavaScript
、Python
、TypeScript
、PHP
、SQL
、JSX
、reStructuredText
、Rust
、C
、CSS
、Go
、C++
、HTML
、Vue
、Ruby
、Jupyter Notebook
、R
、Shell
训练数据集总计包含 1750 亿 token,重复训练 3 个 epoch —— 总计 replit-code-v1-3b
训练了 5250 亿 token(约每个参数 195 token)。
该模型在 MosaicML 平台上使用 256 块 A100-40GB GPU 训练,利用了其最新的 LLM 示例库。
replit-code-v1-3b
采用了前沿的 LLM 技术,例如:
Flash Attention 加速训练和推理,
AliBi 位置编码 支持推理时可变上下文长度,
LionW 优化器,
等。
预期用途
Replit 希望该模型作为基础模型,供任何人进行应用特定的微调,且不严格限制商业用途。
局限性
尽管经过数据清洗过滤,预训练数据集中仍可能包含冒犯或不适当内容,此类内容可能反映在模型生成的文本中。建议在生产系统中使用时保持合理谨慎。请勿用于可能对个人或群体造成伤害或困扰的应用场景。
许可证
模型检查点和词汇文件采用知识共享许可协议(CC BY-SA-4.0)。根据该许可,您必须注明 Replit 的署名、提供许可协议链接并说明是否进行了更改。您可以以任何合理方式满足这些要求,但不得以任何方式暗示 Replit 认可您或您的使用。
源代码文件(*.py
)采用 Apache 2.0 许可证。
联系方式
有关该模型的问题和意见,请在社区版块中发布。
使用方法
首先,您需要安装以下依赖的最新版本:
einops
sentencepiece
torch
transformers
然后按如下方式加载模型:
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained('replit/replit-code-v1-3b', trust_remote_code=True)
要在支持 BF16 精度的 GPU 上使用优化的 Triton 版 FlashAttention,请先安装以下依赖:
flash-attn==0.2.8
triton==2.0.0.dev20221202
然后将模型转换为 bfloat16
并按如下方式使用:
from transformers import AutoModelForCausalLM, AutoConfig
config = AutoConfig.from_pretrained(
"replit/replit-code-v1-3b",
trust_remote_code=True
)
config.attn_config['attn_impl'] = 'triton'
model = AutoModelForCausalLM.from_pretrained('replit/replit-code-v1-3b', config=config, trust_remote_code=True)
model.to(device='cuda:0', dtype=torch.bfloat16)
x = torch.tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
x = x.to(device='cuda:0')
y = model(x)
注意,from_pretrained
方法中传递了 trust_remote_code=True
,因为 ReplitLM 不是 Transformers 库中的类。
分词器
我们训练了一个自定义的 SentencePiece Unigram 分词器,专门针对代码优化了 32768 个 token 的词汇表。
注意,使用此分词器需要安装 sentencepiece
库。
分词器可按如下方式使用:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained('replit/replit-code-v1-3b', trust_remote_code=True)
x = tokenizer.encode('def hello():\n print("hello world")\n', return_tensors='pt')
y = model.generate(x)
generated_code = tokenizer.decode(y[0], skip_special_tokens=True, clean_up_tokenization_spaces=False)
print(generated_code)
注意:
trust_remote_code=True
被传递给 from_pretrained
方法,因为 ReplitLM 不是 Transformers 库中的类。
clean_up_tokenization_spaces=False
旨在避免移除输出中的空格,因为这会影响生成代码的语法正确性。
生成
您可以使用 transformers
库按如下方式生成代码:
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained('replit/replit-code-v1-3b', trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained('replit/replit-code-v1-3b', trust_remote_code=True)
x = tokenizer.encode('def fibonacci(n): ', return_tensors='pt')
y = model.generate(x, max_length=100, do_sample=True, top_p=0.95, top_k=4, temperature=0.2, num_return_sequences=1, eos_token_id=tokenizer.eos_token_id)
generated_code = tokenizer.decode(y[0], skip_special_tokens=True, clean_up_tokenization_spaces=False)
print(generated_code)
尝试不同的解码方法和参数,以获得最适合您用例的结果。
8 位和 4 位量化加载
8 位加载
您还可以使用 load_in_8bit=True
参数以 8 位加载模型,其底层使用了 bitsandbytes
。
首先需要安装以下额外依赖:
accelerate
bitsandbytes
然后按如下方式以 8 位加载模型:
model = AutoModelForCausalLM.from_pretrained("replit/replit-code-v1-3b",
trust_remote_code=True,
device_map="auto",
load_in_8bit=True)
额外的参数 device_map='auto'
和 load_in_8bit=True
实现了这一功能。
4 位加载
在撰写本文时,load_in_4bit
尚未合并到 transformers
和 accelerate
的最新版本中。但如果您安装这些仓库的 main
分支依赖,可以使用该功能:
pip install git+https://github.com/huggingface/accelerate.git
pip install git+https://github.com/huggingface/transformers.git
然后以 4 位加载:
model = AutoModelForCausalLM.from_pretrained("replit/replit-code-v1-3b",
trust_remote_code=True,
device_map="auto",
load_in_4bit=True)
参考
后处理
请注意,与所有代码生成模型一样,生成代码的后处理非常重要。特别推荐以下后处理步骤:
- 遇到 EOS token 时停止生成
- 移除尾部空格
- 根据您的补全用例设置合理的
max_tokens
值
- 在
max_tokens
大于预期生成代码长度时,截断生成以避免不完整代码,例如在遇到 return
、def
、"```"、"\n\n\n
" 等停止词时停止生成。