模型概述
模型特點
模型能力
使用案例
🚀 CodeGemma
CodeGemma是基於Gemma構建的輕量級開放代碼模型集合,提供多種參數變體,可用於代碼補全、代碼生成、代碼對話和代碼教育等場景,在多個領域的學術基準測試中表現出色。
🚀 快速開始
要在Hugging Face上使用CodeGemma,你需要審查並同意Google的使用許可。請確保你已登錄Hugging Face,然後點擊下方按鈕。請求將立即處理。
✨ 主要特性
- 多任務支持:支持代碼補全、從自然語言生成代碼、代碼對話和指令跟隨等多種任務。
- 多參數變體:提供70億參數預訓練變體、70億參數指令微調變體和20億參數預訓練變體,滿足不同需求。
- 高性能表現:在多個編碼和自然語言基準測試中取得了優異的成績。
- 嚴格安全過濾:採用了嚴格的安全過濾機制,確保模型輸出符合安全和質量要求。
📚 詳細文檔
模型信息
描述
CodeGemma是基於Gemma構建的輕量級開放代碼模型集合。CodeGemma模型是僅解碼器的文本到文本和文本到代碼模型,有70億參數的預訓練變體(專注於代碼補全和代碼生成任務)、70億參數的指令微調變體(用於代碼對話和指令跟隨)和20億參數的預訓練變體(用於快速代碼補全)。
功能 | codegemma-2b | codegemma-7b | codegemma-7b-it |
---|---|---|---|
代碼補全 | ✅ | ✅ | |
從自然語言生成代碼 | ✅ | ✅ | |
代碼對話 | ✅ | ||
指令跟隨 | ✅ |
輸入和輸出
- 輸入:
- 預訓練模型變體:代碼補全和生成場景的代碼前綴和/或後綴,或自然語言文本或提示。
- 指令微調模型變體:自然語言文本或提示。
- 輸出:
- 預訓練模型變體:中間填充代碼補全、代碼和自然語言。
- 指令微調模型變體:代碼和自然語言。
模型數據
訓練數據集
以Gemma為基礎模型,CodeGemma 2B和7B預訓練變體在額外的5000億個主要為英語的令牌上進行了進一步訓練,這些數據來自公開可用的代碼倉庫、開源數學數據集和合成生成的代碼。
訓練數據處理
採用了以下數據預處理技術:
- FIM預訓練:CodeGemma模型專注於中間填充(FIM)任務,支持PSM和SPM模式,FIM率為80%,PSM/SPM比例為50-50。
- 基於依賴圖和單元測試的打包技術:為了提高模型與實際應用的對齊度,在項目/倉庫級別構建訓練示例,採用了基於依賴圖的打包和基於單元測試的詞法打包技術。
- 文檔拆分技術:開發了一種將文檔拆分為前綴、中間和後綴的新技術,使後綴的起始位置在語法上更加自然。
- 安全過濾:與Gemma類似,採用了嚴格的安全過濾機制,包括過濾個人數據、CSAM過濾和其他基於內容質量和安全的過濾。
實現信息
硬件
CodeGemma使用最新一代的張量處理單元(TPU)硬件(TPUv5e)進行訓練。
軟件
使用JAX和ML Pathways進行訓練。
評估信息
評估方法
在多個領域的各種學術基準測試中對CodeGemma進行評估:
- 代碼補全基準:HumanEval單行和多行填充。
- 代碼生成基準:HumanEval、MBPP、BabelCode(C++、C#、Go、Java、JavaScript、Kotlin、Python、Rust)。
- 問答:BoolQ、PIQA、TriviaQA。
- 自然語言:ARC-Challenge、HellaSwag、MMLU、WinoGrande。
- 數學推理:GSM8K、MATH。
評估結果
編碼基準
基準測試 | 2B | 7B | 7B-IT |
---|---|---|---|
HumanEval | 31.1 | 44.5 | 56.1 |
MBPP | 43.6 | 56.2 | 54.2 |
HumanEval單行 | 78.41 | 76.09 | 68.25 |
HumanEval多行 | 51.44 | 58.44 | 20.05 |
BC HE C++ | 24.2 | 32.9 | 42.2 |
BC HE C# | 10.6 | 22.4 | 26.7 |
BC HE Go | 20.5 | 21.7 | 28.6 |
BC HE Java | 29.2 | 41.0 | 48.4 |
BC HE JavaScript | 21.7 | 39.8 | 46.0 |
BC HE Kotlin | 28.0 | 39.8 | 51.6 |
BC HE Python | 21.7 | 42.2 | 48.4 |
BC HE Rust | 26.7 | 34.1 | 36.0 |
BC MBPP C++ | 47.1 | 53.8 | 56.7 |
BC MBPP C# | 28.7 | 32.5 | 41.2 |
BC MBPP Go | 45.6 | 43.3 | 46.2 |
BC MBPP Java | 41.8 | 50.3 | 57.3 |
BC MBPP JavaScript | 45.3 | 58.2 | 61.4 |
BC MBPP Kotlin | 46.8 | 54.7 | 59.9 |
BC MBPP Python | 38.6 | 59.1 | 62.0 |
BC MBPP Rust | 45.3 | 52.9 | 53.5 |
自然語言基準
倫理與安全
評估方法
評估方法包括結構化評估和對相關內容政策的內部紅隊測試。紅隊測試由多個不同團隊進行,每個團隊有不同的目標和人工評估指標。這些模型在多個與倫理和安全相關的類別中進行了評估,包括:
- 人工評估:對涵蓋內容安全和代表性危害的提示進行人工評估。有關評估方法的更多詳細信息,請參閱Gemma模型卡片。
- 特定測試:對網絡攻擊能力進行特定測試,重點測試自主黑客能力並確保潛在危害得到限制。
評估結果
倫理和安全評估結果在符合內部政策的可接受閾值內,包括兒童安全、內容安全、代表性危害、記憶和大規模危害等類別。有關更多詳細信息,請參閱Gemma模型卡片。
模型使用與限制
預期用途
Code Gemma模型有廣泛的應用,不同的IT和PT模型有不同的用途。以下是可能的用途列表,但不全面。此列表的目的是提供有關模型創建者在模型訓練和開發過程中考慮的可能用例的上下文信息。
- 代碼補全:PT模型可用於通過IDE擴展完成代碼。
- 代碼生成:IT模型可用於在有或沒有IDE擴展的情況下生成代碼。
- 代碼對話:IT模型可驅動討論代碼的對話界面。
- 代碼教育:IT模型支持交互式代碼學習體驗,有助於語法糾正或提供編碼練習。
已知限制
大語言模型(LLM)基於其訓練數據和技術的固有侷限性存在限制。有關LLM限制的更多詳細信息,請參閱Gemma模型卡片。
倫理考慮與風險
大語言模型(LLM)的開發引發了一些倫理問題。在這些模型的開發過程中,我們仔細考慮了多個方面。有關模型詳細信息,請參閱Gemma模型卡片中的相同討論。
優勢
在發佈時,與類似規模的模型相比,這個模型家族提供了高性能的、專注於開放代碼的大語言模型實現,從一開始就為負責任的AI開發而設計。使用本文檔中描述的編碼基準評估指標,這些模型在性能上優於其他類似規模的開放模型替代品。
💻 使用示例
基礎用法
代碼補全
from transformers import GemmaTokenizer, AutoModelForCausalLM
model_id = "google/codegemma-2b"
tokenizer = GemmaTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)
prompt = '''\
<|fim_prefix|>import datetime
def calculate_age(birth_year):
"""Calculates a person's age based on their birth year."""
current_year = datetime.date.today().year
<|fim_suffix|>
return age<|fim_middle|>\
'''
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
prompt_len = inputs["input_ids"].shape[-1]
outputs = model.generate(**inputs, max_new_tokens=100)
print(tokenizer.decode(outputs[0][prompt_len:]))
代碼生成
from transformers import GemmaTokenizer, AutoModelForCausalLM
tokenizer = GemmaTokenizer.from_pretrained("google/codegemma-2b")
model = AutoModelForCausalLM.from_pretrained("google/codegemma-2b")
input_text = "Write me a Python function to calculate the nth fibonacci number."
input_ids = tokenizer(input_text, return_tensors="pt")
outputs = model.generate(**input_ids)
print(tokenizer.decode(outputs[0]))
高級用法
代碼補全(帶終止符)
FIM_PREFIX = '<|fim_prefix|>'
FIM_SUFFIX = '<|fim_suffix|>'
FIM_MIDDLE = '<|fim_middle|>'
FIM_FILE_SEPARATOR = '<|file_separator|>'
terminators = tokenizer.convert_tokens_to_ids([FIM_PREFIX, FIM_MIDDLE, FIM_SUFFIX, FIM_FILE_SEPARATOR])
terminators += [tokenizer.eos_token_id]
outputs = model.generate(
**inputs,
max_new_tokens=100,
eos_token_id=terminators,
)
📄 許可證
本項目採用gemma許可證。
其他信息



