ai.google.dev에서 보기 | Google Colab에서 실행 | GitHub에서 소스 보기 |
CodeGemma는 Gemini 모델을 만드는 데 사용된 것과 동일한 연구와 기술을 바탕으로 빌드된 최첨단 경량 개방형 모델 제품군입니다.
CodeGemma 모델은 주로 5, 000억 개 이상의 코드 토큰으로 학습되었으며 Gemma 모델군과 동일한 아키텍처를 사용합니다 결과적으로 CodeGemma 모델은 완성된 두 코드 모두에서 최고의 코드 성능을 달성합니다. 생성 작업을 자동화하는 동시에 대규모 언어 모델을 학습시킬 수 있습니다
CodeGemma에는 세 가지 변형이 있습니다.
- 7B 코드 선행 학습된 모델
- 7B 명령 조정 코드 모델
- 코드 입력 및 개방형 생성을 위해 특별히 학습된 2B 모델입니다.
이 가이드에서는 코드 완성 작업을 위해 KerasNLP와 함께 CodeGemma 2B 모델을 사용하는 방법을 설명합니다.
설정
CodeGemma에 액세스하기
이 튜토리얼을 완료하려면 먼저 Gemma 설정에서 설정 안내를 완료해야 합니다. Gemma 설정 안내에서는 다음 작업을 수행하는 방법을 보여줍니다.
- kaggle.com에서 Gemma에 액세스하세요.
- 실행하기에 충분한 리소스가 있는 Colab 런타임을 선택하세요. Gemma 2B 모델이죠.
- Kaggle 사용자 이름 및 API 키를 생성하고 구성합니다.
Gemma 설정을 완료한 후 다음 섹션으로 이동하여 Colab 환경의 환경 변수를 설정합니다.
런타임 선택
이 튜토리얼을 완료하려면 CodeGemma 2B 모델을 실행하기에 충분한 리소스가 포함된 Colab 런타임이 있어야 합니다. 이 경우 T4 GPU를 사용할 수 있습니다.
- Colab 창 오른쪽 상단에서 ▾ (추가 연결 옵션)를 선택합니다.
- 런타임 유형 변경을 선택합니다.
- 하드웨어 가속기에서 T4 GPU를 선택합니다.
API 키 구성
Gemma를 사용하려면 Kaggle 사용자 이름과 Kaggle API 키를 제공해야 합니다.
Kaggle API 키를 생성하려면 Kaggle 사용자 프로필의 계정 탭으로 이동하여 새 토큰 만들기를 선택합니다. 이렇게 하면 API 사용자 인증 정보가 포함된 kaggle.json
파일의 다운로드가 트리거됩니다.
Colab에서 왼쪽 창에 있는 Secrets (VC)를 선택하고 Kaggle 사용자 이름과 Kaggle API 키를 추가합니다. 사용자 이름을 KAGGLE_USERNAME
이름으로, API 키를 KAGGLE_KEY
이름 아래에 저장합니다.
환경 변수 설정하기
KAGGLE_USERNAME
및 KAGGLE_KEY
의 환경 변수를 설정합니다.
import os
from google.colab import userdata
os.environ["KAGGLE_USERNAME"] = userdata.get('KAGGLE_USERNAME')
os.environ["KAGGLE_KEY"] = userdata.get('KAGGLE_KEY')
종속 항목 설치
pip install -q -U keras-nlp
백엔드 선택
Keras는 단순성과 사용 편의성을 위해 설계된 높은 수준의 다중 프레임워크 딥 러닝 API입니다. Keras 3을 사용하면 TensorFlow, JAX, PyTorch의 세 가지 백엔드 중 하나에서 워크플로를 실행할 수 있습니다.
이 튜토리얼에서는 TensorFlow의 백엔드를 구성합니다.
os.environ["KERAS_BACKEND"] = "tensorflow" # Or "jax" or "torch".
패키지 가져오기
Keras와 KerasNLP를 가져옵니다.
import keras_nlp
import keras
# Run at half precision.
keras.config.set_floatx("bfloat16")
모델 로드
KerasNLP는 널리 사용되는 여러 모델 아키텍처의 구현을 제공합니다. 이 튜토리얼에서는 인과 언어 모델링을 위한 엔드 투 엔드 Gemma 모델인 GemmaCausalLM
를 사용하여 모델을 만듭니다. 인과 언어 모델은 이전 토큰을 기반으로 다음 토큰을 예측합니다.
from_preset
메서드를 사용하여 모델을 만듭니다.
gemma_lm = keras_nlp.models.GemmaCausalLM.from_preset("code_gemma_2b_en")
gemma_lm.summary()
Downloading from https://www.kaggle.com/api/v1/models/keras/codegemma/keras/code_gemma_2b_en/1/download/config.json... 100%|██████████| 554/554 [00:00<00:00, 1.41MB/s] Downloading from https://www.kaggle.com/api/v1/models/keras/codegemma/keras/code_gemma_2b_en/1/download/model.weights.h5... 100%|██████████| 4.67G/4.67G [05:06<00:00, 16.4MB/s] Downloading from https://www.kaggle.com/api/v1/models/keras/codegemma/keras/code_gemma_2b_en/1/download/tokenizer.json... 100%|██████████| 401/401 [00:00<00:00, 382kB/s] Downloading from https://www.kaggle.com/api/v1/models/keras/codegemma/keras/code_gemma_2b_en/1/download/assets/tokenizer/vocabulary.spm... 100%|██████████| 4.04M/4.04M [00:01<00:00, 2.41MB/s]
from_preset
메서드는 사전 설정된 아키텍처 및 가중치에서 모델을 인스턴스화합니다. 위의 코드에서 code_gemma_2b_en
문자열은 미리 설정된 아키텍처(매개변수 20억 개를 가진 CodeGemma 모델)를 지정합니다.
중간 채우기 코드 완성
이 예시에서는 CodeGemma의 FIM (fill-in-the-Middle) 기능을 사용하여 주변 컨텍스트를 기반으로 코드를 완성합니다. 이는 텍스트 커서가 커서 주위의 코드에 기반하는 위치 (커서 앞뒤)에 있는 코드를 삽입하는 코드 편집기 애플리케이션에서 특히 유용합니다.
CodeGemma를 사용하면 사용자 정의 토큰 4개(FIM에 3개, 다중 파일 컨텍스트 지원에 <|file_separator|>
토큰)를 사용할 수 있습니다. 이를 사용하여 상수를 정의합니다.
BEFORE_CURSOR = "<|fim_prefix|>"
AFTER_CURSOR = "<|fim_suffix|>"
AT_CURSOR = "<|fim_middle|>"
FILE_SEPARATOR = "<|file_separator|>"
모델의 중지 토큰을 정의합니다.
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)
코드 완성 프롬프트의 형식을 지정합니다. 참고:
- FIM 토큰과 접두사 및 접미사 사이에는 공백이 없어야 합니다.
- 모델이 계속 입력하도록 FIM 중간 토큰이 맨 끝에 있어야 합니다.
- 파일에서 커서가 현재 있는 위치 또는 모델에 제공할 컨텍스트의 양에 따라 접두사 또는 접미사가 비어 있을 수 있습니다.
도우미 함수를 사용하여 프롬프트 형식을 지정합니다.
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)
<|fim_prefix|>import <|fim_suffix|>if __name__ == "__main__": sys.exit(0)<|fim_middle|>
프롬프트를 실행합니다. 응답 토큰을 스트리밍하는 것이 좋습니다. 사용자 정의 토큰이나 턴 종료/senetence 토큰 중 하나가 발생하면 스트리밍을 중지하여 결과 코드를 완성합니다.
gemma_lm.generate(prompt, stop_token_ids=stop_token_ids, max_length=128)
'<|fim_prefix|>import <|fim_suffix|>if __name__ == "__main__":\n sys.exit(0)<|fim_middle|>sys\n<|file_separator|>'
이 모델은 sys
를 추천 코드 완성으로 제공합니다.
요약
이 튜토리얼에서는 CodeGemma를 사용하여 주변 컨텍스트에 따라 코드를 채우는 방법을 안내했습니다. 다음으로 CodeGemma 및 KerasNLP 노트북을 사용한 AI 지원 프로그래밍에서 CodeGemma를 사용하는 방법에 대한 더 많은 예시를 확인하세요.
CodeGemma 모델의 기술 사양은 CodeGemma 모델 카드를 참고하세요.