Zobacz na ai.google.dev | Uruchom w Google Colab | Wyświetl źródło na GitHubie |
Z tego notatnika dowiesz się, jak zacząć korzystać z usługi dostrajania przy użyciu biblioteki klienta w języku Python na potrzeby interfejsu Gemini API. W tym artykule dowiesz się, jak dostroić model tekstowy odpowiedzialny za usługę generowania tekstu przez interfejs Gemini API.
Konfiguracja
Uwierzytelnij
Interfejs Gemini API umożliwia dostrajanie modeli na podstawie Twoich własnych danych. To Twoje dane i dostrojone modele, wymagają więc bardziej rygorystycznej kontroli dostępu niż klucz API.
Zanim uruchomisz ten samouczek, musisz skonfigurować OAuth w swoim projekcie.
W Colab najłatwiej skopiować zawartość pliku client_secret.json
do „Menedżera obiektów tajnych” w Colab (pod ikoną klucza w panelu po lewej stronie) o nazwie CLIENT_SECRET
.
To polecenie gcloud przekształca plik client_secret.json
w dane logowania, których można używać do uwierzytelniania w usłudze.
import os
if 'COLAB_RELEASE_TAG' in os.environ:
from google.colab import userdata
import pathlib
pathlib.Path('client_secret.json').write_text(userdata.get('CLIENT_SECRET'))
# Use `--no-browser` in colab
!gcloud auth application-default login --no-browser --client-id-file client_secret.json --scopes='https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/generative-language.tuning'
else:
!gcloud auth application-default login --client-id-file client_secret.json --scopes='https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/generative-language.tuning'
Instalowanie biblioteki klienta
pip install -q google-generativeai
Importuj biblioteki
import google.generativeai as genai
Istniejące dostrojone modele możesz sprawdzić za pomocą metody genai.list_tuned_model
.
for i, m in zip(range(5), genai.list_tuned_models()):
print(m.name)
tunedModels/my-model-8527 tunedModels/my-model-7092 tunedModels/my-model-2778 tunedModels/my-model-1298 tunedModels/my-model-3883
Utwórz model dostrojony
Aby utworzyć model dostrojony, musisz przekazać mu zbiór danych w metodzie genai.create_tuned_model
. Możesz to zrobić bezpośrednio przez definiowanie wartości wejściowych i wyjściowych w wywołaniu lub importować dane z pliku do ramki danych w celu przekazania tej metody do tej metody.
W tym przykładzie dostrojesz model tak, aby wygenerował kolejną liczbę w sekwencji. Jeśli np. dane wejściowe to 1
, model powinien zwrócić wynik 2
. Jeśli dane wejściowe to one hundred
, dane wyjściowe powinny mieć postać one hundred one
.
base_model = [
m for m in genai.list_models()
if "createTunedModel" in m.supported_generation_methods][0]
base_model
Model(name='models/gemini-1.0-pro-001', base_model_id='', version='001', display_name='Gemini 1.0 Pro', description=('The best model for scaling across a wide range of tasks. This is a stable ' 'model that supports tuning.'), input_token_limit=30720, output_token_limit=2048, supported_generation_methods=['generateContent', 'countTokens', 'createTunedModel'], temperature=0.9, top_p=1.0, top_k=1)
import random
name = f'generate-num-{random.randint(0,10000)}'
operation = genai.create_tuned_model(
# You can use a tuned model here too. Set `source_model="tunedModels/..."`
source_model=base_model.name,
training_data=[
{
'text_input': '1',
'output': '2',
},{
'text_input': '3',
'output': '4',
},{
'text_input': '-3',
'output': '-2',
},{
'text_input': 'twenty two',
'output': 'twenty three',
},{
'text_input': 'two hundred',
'output': 'two hundred one',
},{
'text_input': 'ninety nine',
'output': 'one hundred',
},{
'text_input': '8',
'output': '9',
},{
'text_input': '-98',
'output': '-97',
},{
'text_input': '1,000',
'output': '1,001',
},{
'text_input': '10,100,000',
'output': '10,100,001',
},{
'text_input': 'thirteen',
'output': 'fourteen',
},{
'text_input': 'eighty',
'output': 'eighty one',
},{
'text_input': 'one',
'output': 'two',
},{
'text_input': 'three',
'output': 'four',
},{
'text_input': 'seven',
'output': 'eight',
}
],
id = name,
epoch_count = 100,
batch_size=4,
learning_rate=0.001,
)
Dostrojony model zostanie natychmiast dodany do listy dostrojonych modeli, ale jego stan będzie ustawiony na „tworzenie” podczas dostrajania.
model = genai.get_tuned_model(f'tunedModels/{name}')
model
TunedModel(name='tunedModels/generate-num-2946', source_model='models/gemini-1.0-pro-001', base_model='models/gemini-1.0-pro-001', display_name='', description='', temperature=0.9, top_p=1.0, top_k=1, state=<State.CREATING: 1>, create_time=datetime.datetime(2024, 2, 21, 20, 4, 16, 448050, tzinfo=datetime.timezone.utc), update_time=datetime.datetime(2024, 2, 21, 20, 4, 16, 448050, tzinfo=datetime.timezone.utc), tuning_task=TuningTask(start_time=datetime.datetime(2024, 2, 21, 20, 4, 16, 890698, tzinfo=datetime.timezone.utc), complete_time=None, snapshots=[], hyperparameters=Hyperparameters(epoch_count=100, batch_size=4, learning_rate=0.001)))
model.state
<State.CREATING: 1>
Sprawdzanie postępu dostrajania
Użyj narzędzia metadata
, aby sprawdzić stan:
operation.metadata
total_steps: 375 tuned_model: "tunedModels/generate-num-2946"
Poczekaj na zakończenie trenowania przy użyciu dodatku operation.result()
lub operation.wait_bar()
import time
for status in operation.wait_bar():
time.sleep(30)
0%| | 0/375 [00:00<?, ?it/s]
Zadanie dostrajania możesz w każdej chwili anulować, korzystając z metody cancel()
. Usuń znacznik komentarza z wiersza poniżej i uruchom komórkę z kodem, aby anulować zadanie, zanim zostanie zakończone.
# operation.cancel()
Po zakończeniu dostrajania możesz zobaczyć krzywą straty w wynikach dostrajania. Krzywa straty pokazuje, w jakim stopniu prognozy modelu odbiegają od idealnych danych wyjściowych.
import pandas as pd
import seaborn as sns
model = operation.result()
snapshots = pd.DataFrame(model.tuning_task.snapshots)
sns.lineplot(data=snapshots, x = 'epoch', y='mean_loss')
<Axes: xlabel='epoch', ylabel='mean_loss'>
Ocenianie modelu
Aby przetestować wydajność modelu, możesz użyć metody genai.generate_text
i podać nazwę modelu.
model = genai.GenerativeModel(model_name=f'tunedModels/{name}')
result = model.generate_content('55')
result.text
'56'
result = model.generate_content('123455')
result.text
'123456'
result = model.generate_content('four')
result.text
'five'
result = model.generate_content('quatre') # French 4
result.text # French 5 is "cinq"
'cinq'
result = model.generate_content('III') # Roman numeral 3
result.text # Roman numeral 4 is IV
'IV'
result = model.generate_content('七') # Japanese 7
result.text # Japanese 8 is 八!
'八'
Wygląda na to, że pomimo nielicznych przykładów udało się wykonać zadanie, ale pojęcie „dalej” jest proste. Więcej informacji o poprawianiu skuteczności znajdziesz w przewodniku po dostrajaniu.
Zaktualizuj opis
Opis dostrojonego modelu możesz zaktualizować w dowolnym momencie, korzystając z metody genai.update_tuned_model
.
genai.update_tuned_model(f'tunedModels/{name}', {"description":"This is my model."});
model = genai.get_tuned_model(f'tunedModels/{name}')
model.description
'This is my model.'
Usuwanie modelu
Listę dostrojonych modeli możesz wyczyścić, usuwając te, których już nie potrzebujesz. Aby usunąć model, użyj metody genai.delete_tuned_model
. Jeśli anulujesz zadania dostrajania, możesz je usunąć, ponieważ ich wydajność może być nieprzewidywalna.
genai.delete_tuned_model(f'tunedModels/{name}')
Model już nie istnieje:
try:
m = genai.get_tuned_model(f'tunedModels/{name}')
print(m)
except Exception as e:
print(f"{type(e)}: {e}")
<class 'google.api_core.exceptions.NotFound'>: 404 Tuned model tunedModels/generate-num-2946 does not exist.