英文

replit-code-v1-3b

由Replit,Inc.开发

?‍? Test it on our Demo Space! ?‍?

⚙️ Fine-tuning and Instruct-tuning guides ⚙️

模型描述

replit-code-v1-3b是一个2.7B的因果语言模型,专注于代码补全。模型在 Stack Dedup v1.2 dataset 的子集上进行了训练。

训练混合包括20种不同的语言,按标记数降序排列:Markdown,Java,JavaScript,Python,TypeScript,PHP,SQL,JSX,reStructuredText,Rust,C,CSS,Go,C ++,HTML,Vue,Ruby,Jupyter Notebook,R,Shell。总共,训练数据集包含175B个标记,它们在3个时期内重复进行训练 - 总共,replit-code-v1-3b已经在525B个标记(每个参数约195个标记)上进行了训练。

模型已经在 MosaicML 平台上使用256 x A100-40GB GPU进行训练,利用了它们最新的 LLM examples repo 。 replit-code-v1-3b采用了最先进的LLM技术,例如: Flash Attention 可实现快速训练和推理, AliBi positional embeddings 可在推理时支持可变上下文长度, LionW optimizer 等。

打算使用

Replit打算使此模型可供任何人用作应用特定微调的基础模型,没有对商业使用的严格限制。

限制

预训练数据集可能包含冒犯或不恰当的内容,即使应用了数据清洗过滤器,这些内容可能在模型生成的文本中反映出来。我们建议用户在使用生产系统时保持合理的谨慎。请勿将其用于可能对个人或集体造成伤害或困扰的任何应用。

许可证

模型检查点和词汇文件的许可证属于知识共享许可证(CC BY-SA-4.0)。根据此许可证,您必须给予Replit信用,提供许可证的链接,并指示是否进行了更改。您可以以任何合理的方式执行此操作,但不能以任何方式暗示Replit代言您或您的使用方式。

源代码文件(*.py)根据Apache 2.0许可证获得许可。

联系方式

关于模型的问题和评论,请在社区部分发布。

使用方法

首先,您需要安装以下依赖项的最新版本:

einops
sentencepiece
torch
transformers

然后可以按以下方式加载模型:

from transformers import AutoModelForCausalLM

# load model
model = AutoModelForCausalLM.from_pretrained('replit/replit-code-v1-3b', trust_remote_code=True)

要使用基于Triton实现的FlashAttention的带有BF16精度的GPU,首先安装以下依赖项:

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'

# load model
model = AutoModelForCausalLM.from_pretrained('replit/replit-code-v1-3b', config=config, trust_remote_code=True)
model.to(device='cuda:0', dtype=torch.bfloat16)

# forward pass
x = torch.tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
x = x.to(device='cuda:0')
y = model(x)

注意,将trust_remote_code=True传递给from_pretrained方法,因为ReplitLM不是 Transformers 库中的类。

分词器

我们训练了一个定制的SentencePiece Unigram分词器,针对32768个标记的代码进行了优化。

请注意,使用此功能需要安装sentencepiece库。

分词器的使用方法如下:

from transformers import AutoTokenizer

# load tokenizer
tokenizer = AutoTokenizer.from_pretrained('replit/replit-code-v1-3b', trust_remote_code=True)

# single input encoding + generation
x = tokenizer.encode('def hello():\n  print("hello world")\n', return_tensors='pt')
y = model.generate(x)

# decoding, clean_up_tokenization_spaces=False to ensure syntactical correctness
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)

# decoding, clean_up_tokenization_spaces=False to ensure syntactical correctness
generated_code = tokenizer.decode(y[0], skip_special_tokens=True, clean_up_tokenization_spaces=False)
print(generated_code)

尝试不同的解码方法和参数,以获得适合您使用情况的最佳结果。

后处理

请注意,与所有代码生成模型一样,对生成的代码进行后处理非常重要。特别是推荐执行以下后处理步骤:

  • 在遇到EOS标记时停止生成
  • 删除尾部空格
  • 根据完成的使用情况,将max_tokens设置为合理的值
  • 截断生成以避免生成不完整的代码,例如return,def,“```”,“\n\n\n”等待词,当max_tokens大于预期生成代码的长度时。