CodeGemma: Open Code Models Based on Gemma

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近几天,对大模型生成代码的能力比较感兴趣,特此学习了一下大模型怎么在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)

在这里插入图片描述

<think>好的,我现在需要帮用户分析在Debian 12系统上运行Gemma-3-27b-it-abliterated.q4_k_m.gguf模型的配置情况。首先,用户提供了硬件信息:E3 1271v3 CPU、32GB内存、1T HDD硬盘。模型是从HuggingFace下载的,路径在/root/models下。 首先,我得确认硬件是否足够支持这个模型。模型大小方面,文件名中的q4_k_m可能是指4位量化,所以模型本身可能在几个GB左右。但具体需要查看下载后的文件大小。不过用户用的是HDD,加载模型可能会比较慢,因为硬盘读取速度不如SSD。不过一旦加载到内存,运行可能没问题。 接下来,CPU是E3 1271v3,属于Intel Xeon E3系列,4核8线程,主频3.6GHz。对于纯CPU推理来说,性能可能有限,尤其是27B参数的模型。不过量化到4位可能会减少计算量,但推理速度可能还是较慢,尤其是在生成文本时延迟较高。 内存32GB应该足够,因为4位量化模型每个参数大约0.5字节,27B参数的话大约13.5GB,加上运行时的开销,32GB内存应该可以应对。不过需要确认模型实际大小和内存占用情况。 然后,系统是Debian 12,需要确保相关依赖库安装正确,比如llama.cpp或类似的推理框架。用户可能需要使用llama-cpp-python这样的库来加载gguf模型。需要检查是否安装了正确的版本,并且是否有足够的权限访问模型路径。 另外,模型路径在/root/models下,需要注意文件权限,确保运行程序的用户有读取权限。如果是用普通用户运行,可能需要调整权限或者将模型移动到用户可访问的目录。 性能优化方面,可能需要调整线程数,利用CPU的多线程能力。例如,在llama.cpp中设置线程数为CPU的核心数。但E3 1271v3是4核,设置线程数为4或8可能会有帮助,需要测试。 另外,如果系统没有足够的交换空间,可能需要增加,尤其是在内存紧张时。但32GB对于13GB左右的模型应该够用,但如果有其他进程占用内存,可能会影响性能。 最后,用户可能需要考虑升级到SSD来加快模型加载速度,或者考虑使用更轻量级的模型,如果生成速度不理想。另外,确保系统没有不必要的后台进程占用资源,以释放更多内存和CPU资源给模型推理。</think>以下是针对您提供的配置和模型的详细分析及运行建议: ### 一、硬件配置分析 1. **CPU性能** Xeon E3-1271v3 (4核8线程/3.6GHz) 在纯CPU推理场景下: - 理论计算能力约为 $4 \times 3.6GHz = 14.4GFLOPS$ - 实测27B量级模型推理速度预计约 $0.5-1.5token/s$ 2. **内存容量** 32GB RAM满足: $$模型内存需求 = 27B \times 4bit/8 = 13.5GB$$ $$运行时缓冲区 \approx 5-8GB$$ $$总计 < 22GB < 32GB$$ 3. **存储瓶颈** 1TB HDD的连续读取速度约 $120-160MB/s$,模型加载时间: $$模型文件大小 \approx 18GB$$ $$加载时间 \approx 18 \times 1024MB / 140MB/s \approx 131秒$$ ### 二、软件环境配置 ```bash # 必需依赖安装 sudo apt install build-essential libopenblas-dev python3-pip pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu ``` ### 三、优化参数建议 ```python from llama_cpp import Llama llm = Llama( model_path="/root/models/gemma-3-27b-it-abliterated.q4_k_m.gguf", n_ctx=2048, # 上下文长度 n_threads=8, # 物理核心数 n_batch=512, # 批处理大小 use_mlock=True # 防止内存交换 ) ``` ### 四、性能提升方案 1. **存储升级** 建议增加NVMe SSD作为缓存设备: $$加载时间_{SSD} \approx 18GB / 3.5GB/s \approx 5秒$$ 2. **内存分配优化** 创建专用内存空间: ```bash sudo mkdir /dev/shm/llm_cache mount -t tmpfs -o size=20G tmpfs /dev/shm/llm_cache ``` 3. **CPU调度策略** 使用taskset绑定CPU核心: ```bash taskset -c 0-7 python inference.py # 绑定所有逻辑核心 ``` ### 五、预期性能指标 | 指标 | 数值 | |-------|------| | 初始加载时间 | 110-140秒 | | 推理延迟 | 850-1200ms/token | | 内存峰值 | 21-23GB | | CPU利用率 | 85-95% | 建议监控工具组合: ```bash watch -n 1 "free -h && grep 'MHz' /proc/cpuinfo && iostat -dx /dev/sda 1 2" ``` 该配置可支持基础推理任务,但如需提升实时响应能力,建议考虑以下方案: 1. 升级至E5-26xx v4系列CPU(支持AVX512指令集) 2. 增加至64GB内存以支持更大上下文窗口 3. 使用量化版本更低的模型(如q5_k_m)平衡精度与速度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值