Krótkie wprowadzenie do Keras CodeGemma

Wyświetl na ai.google.dev Uruchom w Google Colab Wyświetl źródło w GitHubie

CodeGemma to rodzina lekkich, nowoczesnych modeli otwartych opartych na tych samych badaniach i technologii, które posłużyły do utworzenia modeli Gemini.

Modele CodeGemma są trenowane na ponad 500 miliardach tokenów, głównie kodu, przy użyciu o tej samej architekturze co rodzina modeli Gemma. Dzięki temu modele CodeGemma uzyskują najwyższą wydajność kodu zarówno podczas i generowania zadań, a jednocześnie rozumienia i rozumowania na dużą skalę.

CodeGemma ma 3 warianty:

  • Wytrenowany model 7B z użyciem kodu
  • Model kodu 7B dostrojony według instrukcji
  • Model 2B wytrenowany specjalnie pod kątem uzupełniania kodu i generowania otwartego.

W tym przewodniku omawiamy korzystanie z modelu CodeGemma 2B w połączeniu z KerasNLP w celu uzupełniania kodu.

Konfiguracja

Dostęp do CodeGemma

Aby ukończyć ten samouczek, musisz najpierw wykonać instrukcje konfiguracji opisane na stronie konfiguracji Gemma. Z instrukcji konfiguracji Gemma dowiesz się, jak:

  • Uzyskaj dostęp do Gemmy na kaggle.com.
  • Wybierz środowisko wykonawcze Colab z wystarczającą ilością zasobów do uruchomienia modelu Gemma 2B.
  • Wygeneruj i skonfiguruj nazwę użytkownika i klucz interfejsu API Kaggle.

Po zakończeniu konfiguracji Gemma przejdź do następnej sekcji, w której możesz ustawić zmienne środowiskowe dla środowiska Colab.

Wybierz środowisko wykonawcze

Aby dokończyć ten samouczek, musisz mieć środowisko wykonawcze Colab z wystarczającymi zasobami do uruchomienia modelu CodeGemma 2B. W takim przypadku możesz użyć GPU T4:

  1. W prawym górnym rogu okna Colab wybierz ▾ (Dodatkowe opcje połączenia).
  2. Kliknij Zmień typ środowiska wykonawczego.
  3. W sekcji Akcelerator sprzętowy wybierz GPU T4.

Skonfiguruj klucz interfejsu API

Aby używać Gemma, musisz podać swoją nazwę użytkownika Kaggle i klucz interfejsu API Kaggle.

Aby wygenerować klucz interfejsu API Kaggle, otwórz kartę Account (Konto) w profilu użytkownika Kaggle i wybierz Create New Token (Utwórz nowy token). Spowoduje to pobranie pliku kaggle.json zawierającego dane logowania do interfejsu API.

W Colab wybierz Obiekty tajne (🔑) w panelu po lewej stronie i dodaj swoją nazwę użytkownika Kaggle i klucz interfejsu API Kaggle. Zapisz swoją nazwę użytkownika pod nazwą KAGGLE_USERNAME, a klucz interfejsu API pod nazwą KAGGLE_KEY.

Ustawianie zmiennych środowiskowych

Ustaw zmienne środowiskowe dla interfejsów KAGGLE_USERNAME i 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')

Instalowanie zależności

pip install -q -U keras-nlp

Wybierz backend

Keras to wysokopoziomowy, wieloramowy interfejs API deep learning, który został zaprojektowany z myślą o łatwości obsługi. Keras 3 pozwala uruchamiać przepływy pracy w jednym z 3 backendów: TensorFlow, JAX lub PyTorch.

W tym samouczku skonfiguruj backend dla TensorFlow.

os.environ["KERAS_BACKEND"] = "tensorflow"  # Or "jax" or "torch".

Importuj pakiety

Importuj Keras i KerasNLP.

import keras_nlp
import keras

# Run at half precision.
keras.config.set_floatx("bfloat16")

Wczytaj model

KerasNLP udostępnia implementacje wielu popularnych architektur modeli. W tym samouczku utworzysz model przy użyciu GemmaCausalLM – kompleksowego modelu Gemma do modelowania przyczynowo-językowego. Przypadkowy model językowy przewiduje kolejny token na podstawie poprzednich tokenów.

Utwórz model za pomocą metody 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]

Metoda from_preset tworzy instancję modelu na podstawie gotowej architektury i wag. W powyższym kodzie ciąg code_gemma_2b_en określa gotową architekturę – model CodeGemma z 2 miliardami parametrów.

Uzupełnianie kodu w środku

W tym przykładzie korzystamy z dostępnej w CodeGemmy funkcji „fill-in-the-middle” (FIM) w celu dokończenia kodu na podstawie otaczającego je kontekstu. Jest to szczególnie przydatne w edytorach kodu służących do wstawiania kodu w miejscu, w którym kursor tekstowy jest umieszczony względem otaczającego go kodu (przed kursorem i za nim).

CodeGemma umożliwia korzystanie z 4 tokenów definiowanych przez użytkownika – 3 dla FIM i <|file_separator|> do obsługi kontekstu obejmującego wiele plików. Użyj ich do zdefiniowania stałych.

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

Zdefiniuj tokeny zatrzymania dla modelu.

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)

Sformatuj prompt pod kątem uzupełnienia kodu. Uwaga:

  • Między tokenami FIM a prefiksem i sufiksem nie powinno być spacji
  • Środkowy token FIM powinien znajdować się na końcu, aby przygotować model do dalszego wypełniania.
  • Prefiks lub sufiks może być pusty w zależności od tego, gdzie obecnie znajduje się kursor w pliku, lub od tego, jak dużo kontekstu chcesz przekazać modelowi

Sformatuj prompt za pomocą funkcji pomocniczej.

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|>

Uruchom prompt. Zalecamy strumieniowanie tokenów odpowiedzi. Zatrzymaj transmisję po napotkaniu tokena zdefiniowanego przez użytkownika lub tokena końca tury lub sesji, aby uzyskać uzupełnienie kodu.

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|>'

Model udostępnia sys jako sugerowane uzupełnienie kodu.

Podsumowanie

W tym samouczku omawialiśmy korzystanie z CodeGemma do uzupełniania kodu na podstawie otaczającego je kontekstu. Następnie przejrzyj notatnik „AI Assist Programming with CodeGemma i KerasNLP”, w którym znajdziesz więcej przykładów korzystania z CodeGemma.

Na karcie z modelem CodeGemma znajdziesz też dane techniczne modeli.