CodeGemma: Open Code Models Based on Gemma

本文介绍了如何在IDE中利用大模型如CodeGemma和通义灵码进行代码自动补全,通过PSM模式拆分代码并提供实践提示,强调了prompt在大模型代码生成中的重要性。

最近几天,对大模型生成代码的能力比较感兴趣,特此学习了一下大模型怎么在IDE上进行,自动补全你想要的代码。
大模型源码理解-以Gemma为例子
最近也在使用阿里的通义灵码,感觉还挺好用的。通义灵码

摘要:

CodeGemma基于谷歌开源的文本大模型Gemma,结构上跟LLama差不太多。CodeGemma(或者使用在IDE中的大模型)常规的使用GPT或者其它大模型,写prompt去生成代码还是略有区别的,下面就是常规的使用大模型写代码:
在这里插入图片描述
但是在IDE中,不能写prompt让大模型,写代码,这么太方便了,应该类似于自动补全,猜你想写什么代码,增加效率,下面是通义灵码的效果:
在这里插入图片描述

发布版本

公开了三个版本:

  • CodeGemma 7B 预训练版本
  • CodeGemma 7B 指令微调版本
  • CodeGemma 2B 预训练版本
    在这里插入图片描述
    7B和2B训练数据略有差距,7B进行4:1代码数据和自然语言数据进行混合。

如何实现IDE自动生成代码

IDE自动生成代码,和常规的大预言模型训练方式基本上使一致的,或者说和GPT、LLama的训练任务是一致的,但是为了实现你写几个字或者代码,大模型可以自动生成你需要代码。但是在数据构造的时候和常规的方式不一致,则是将一个代码文本信息拆分成三部分,Prefix,Middle,Suffix即三段式,开头,中间,结尾,这三个部分。数据在使用的时候有两种改造方式:

  • PSM Prefix-Suffix-Middle
  • SPM Suffix-Prefix-Middle
    在训练的时候会增加一下特殊的token进行分隔开,如下图所示:
    在这里插入图片描述
    PSM具体样例:
    在这里插入图片描述

实践Prompt:

在具体使用时候,采用以下形式prompt。
在这里插入图片描述
简单代码实现:

BEFORE_CURSOR = "<|fim_prefix|>"
AFTER_CURSOR = "<|fim_suffix|>"
AT_CURSOR = "<|fim_middle|>"
FILE_SEPARATOR = "<|file_separator|>"

stop_token
END_TOKEN = gemma_lm.preprocessor.tokenizer.end_token

stop_tokens = (BEFORE_CURSOR, AFTER_CURSOR, AT_CURSOR, FILE_SEPARATOR, END_TOKEN)

stop_token_ids = tuple(gemma_lm.preprocessor.tokenizer.token_to_id(x) for x in stop_tokens)
def format_completion_prompt(before, after):
    return f"{BEFORE_CURSOR}{before}{AFTER_CURSOR}{after}{AT_CURSOR}"

before = "import "
after = """if __name__ == "__main__":\n    sys.exit(0)"""
prompt = format_completion_prompt(before, after)
print(prompt)

实验结果

在这里插入图片描述

简单体验:

在kaggle平台上简单体验了,网址,测试的时候最大的感触,对于代码生成,或者基于大模型代码自动补全,prompt得严格按照,推荐的prompt,要不效果很差,或者可以说没效果。
一开始prompt采用以下方式,就随便用了一个别人测试方式,进行自己得需求魔改:

def format_completion_prompt(before, after):
    return f"{BEFORE_CURSOR}{before}{AFTER_CURSOR}{after}{AT_CURSOR}"

before = "import "
after = """def sort if __name__ == "__main__":\n    sys.exit(0)"""
prompt = format_completion_prompt(before, after)
print(prompt)

无法实现我们需要的排序方式, 只输出了sys
在这里插入图片描述

严格按照推荐的prompt方式

def format_completion_prompt(test):
    return f"""<|fim_prefix|>import <|fim_suffix|>if __name__ == "__main__":
    sys.exit(0)<|fim_middle|>{test}"""

test = "def quick_sort"
prompt = format_completion_prompt(test)
print(prompt)

在这里插入图片描述

D:\ac\envs\gemma\python.exe G:\MODTEST\google\gemma.py torch mps: False Traceback (most recent call last): File "D:\ac\envs\gemma\lib\site-packages\transformers\utils\hub.py", line 398, in cached_file resolved_file = hf_hub_download( File "D:\ac\envs\gemma\lib\site-packages\huggingface_hub\utils\_validators.py", line 106, in _inner_fn validate_repo_id(arg_value) File "D:\ac\envs\gemma\lib\site-packages\huggingface_hub\utils\_validators.py", line 154, in validate_repo_id raise HFValidationError( huggingface_hub.errors.HFValidationError: Repo id must be in the form 'repo_name' or 'namespace/repo_name': './dataroot/models/alpindale/gemma-2b'. Use `repo_type` argument if needed. The above exception was the direct cause of the following exception: Traceback (most recent call last): File "G:\MODTEST\google\gemma.py", line 71, in <module> generate(args.load_in_8bit, args.load_in_4bit) File "G:\MODTEST\google\gemma.py", line 25, in generate tokenizer = AutoTokenizer.from_pretrained(model_path) File "D:\ac\envs\gemma\lib\site-packages\transformers\models\auto\tokenization_auto.py", line 767, in from_pretrained tokenizer_config = get_tokenizer_config(pretrained_model_name_or_path, **kwargs) File "D:\ac\envs\gemma\lib\site-packages\transformers\models\auto\tokenization_auto.py", line 600, in get_tokenizer_config resolved_config_file = cached_file( File "D:\ac\envs\gemma\lib\site-packages\transformers\utils\hub.py", line 462, in cached_file raise EnvironmentError( OSError: Incorrect path_or_model_id: './dataroot/models/alpindale/gemma-2b'. Please provide either the path to a local folder or the repo_id of a model on the Hub.
最新发布
11-30
<think> 我们正在解决运行gemma.py时出现的huggingface_hub.errors.HFValidationError和OSError错误。错误信息指出Repo id格式不正确(必须是'repo_name'或'namespace/repo_name'格式)以及路径或模型ID错误。 根据经验,这类错误通常由以下原因引起: 1. 模型标识符(model_id)格式错误:Hugging Face模型仓库的标识符应该为`organization/model_name`(例如`google/gemma-7b`)或直接为模型名称(如果它在公共命名空间下,但通常需要组织名)。如果只写了模型名称而没有组织名,可能会报错。 2. 模型不存在:提供的模型标识符在Hugging Face Hub上不存在。 3. 本地缓存路径问题:如果指定了本地路径,可能路径不存在或没有权限访问。 4. 网络问题:无法访问Hugging Face Hub,导致无法验证模型ID。 解决方案: 步骤1:检查模型标识符格式 确保在代码中指定的模型ID是正确的。例如,对于Gemma模型,正确的模型ID可能是`google/gemma-7b`或`google/gemma-7b-it`等。请确认你使用的模型ID符合`namespace/model_name`的格式。 步骤2:验证模型是否存在 访问Hugging Face Hub(https://huggingface.co/)并搜索你使用的模型ID,确认该模型确实存在且公开可用。例如,Gemma模型的页面为:https://huggingface.co/google/gemma-7b 步骤3:检查代码中模型ID的赋值 在gemma.py中,找到设置模型ID的地方。通常,这可能是通过命令行参数、配置文件或直接硬编码的字符串。确保该字符串没有多余的空格或特殊字符。 步骤4:检查Hugging Face Token 如果模型需要访问权限(比如Gemma需要同意使用条款并获取Token),请确保你已经登录Hugging Face CLI并拥有有效的Token。可以通过以下命令登录: huggingface-cli login 然后输入你的Token(在Hugging Face网站的个人设置中获取)。 步骤5:使用正确的模型加载方式 如果你使用的是`from_pretrained`方法,请确保调用方式正确。例如: model = AutoModelForCausalLM.from_pretrained("google/gemma-7b") 步骤6:处理路径问题 如果错误信息提到路径问题,请检查是否指定了不存在的本地路径。如果你想从Hub下载,不要使用本地路径。如果你确实想使用本地模型,请确保路径正确且包含模型文件。 步骤7:更新huggingface_hub库 有时,旧版本的库可能存在问题。尝试更新: pip install --upgrade huggingface_hub transformers 示例代码修正: 假设在gemma.py中,你有如下代码: model_id = "gemma-7b" # 错误的,因为没有命名空间 应改为: model_id = "google/gemma-7b" # 正确的 如果以上步骤不能解决问题,请提供具体的错误堆栈和代码中设置模型ID的部分,以便进一步排查。 引用: [^1]: 根据Hugging Face文档,模型标识符必须是有效的,且用户必须拥有访问权限(如果模型是私有的或受限制的)。此外,确保网络连接正常,特别是对于需要下载模型的情况。 相关问题: §§相关问题§§ 1. 如何获取Hugging Face访问令牌? 2. 如何正确使用huggingface_hub下载模型? 3. 运行Hugging Face模型时常见的认证错误有哪些? 4. Gemma模型的使用需要满足哪些条件? </think> 要解决运行 `gemma.py` 时出现的 `huggingface_hub.errors.HFValidationError` 和 `OSError` 错误,请按照以下步骤操作: ### 错误原因分析 1. **Repo ID 格式错误** Hugging Face 要求模型 ID 必须是 `repo_name` 或 `namespace/repo_name` 格式(如 `google/gemma-7b`),不能包含非法字符或路径分隔符[^1]。 2. **路径或模型 ID 不正确** - 模型可能未在 Hugging Face Hub 上公开 - 本地缓存路径配置错误 - 模型名称拼写错误 ### 解决方案 #### 步骤 1:验证模型 ID 格式 确保代码中的模型 ID 符合标准格式: ```python # 正确格式示例 model_id = "google/gemma-7b" # namespace/repo_name # model_id = "gemma-7b" # 仅当模型在根命名空间时有效(罕见) ``` #### 步骤 2:检查模型可用性 1. 访问 Hugging Face 模型库确认模型存在: https://huggingface.co/google/gemma-7b(替换为你的模型名) 2. 检查模型访问权限:Gemma 需要同意使用条款并登录 #### 步骤 3:正确配置 Hugging Face Token ```python from huggingface_hub import login login(token="hf_YourTokenHere") # 从 https://huggingface.co/settings/tokens 获取 ``` #### 步骤 4:修复路径错误 如果使用本地路径,确保: ```python # 正确本地路径示例 model = AutoModel.from_pretrained("/path/to/model") # 必须是有效目录路径 ``` #### 步骤 5:完整代码示例 ```python from transformers import AutoModel from huggingface_hub import login # 1. 登录(Gemma必须) login(token="hf_YourTokenHere") # 2. 使用标准模型ID model = AutoModel.from_pretrained("google/gemma-7b") # 正确格式 # 或指定本地路径(如果已下载) # model = AutoModel.from_pretrained("./downloaded/gemma-7b") ``` ### 常见问题排查 | 问题现象 | 解决方案 | |---------|----------| | `HFValidationError` | 检查模型ID格式,确保包含命名空间(如`google/`) | | `OSError` | 验证路径是否存在,或改用Hub下载 | | 权限错误 | 运行`huggingface-cli login` 更新token | | 下载失败 | 检查网络连接,或手动下载模型到本地 | ### 补充说明 Gemma 模型使用前必须: 1. 接受模型许可协议:https://huggingface.co/google/gemma-7b 2. 生成访问令牌:https://huggingface.co/settings/tokens 3. 安装最新依赖:`pip install --upgrade transformers huggingface_hub` [^1]: 根据 Hugging Face 文档,模型标识符必须符合 `[a-zA-Z0-9_-]` 命名规范且包含有效命名空间。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值