1. Введение
В этом практическом занятии вы узнаете, как развернуть EmbeddingGemma , мощную многоязычную модель встраивания текста, на платформе Cloud Run с использованием графических процессоров (GPU). Затем вы используете этот развернутый сервис для генерации эмбеддингов для приложения семантического поиска.
В отличие от традиционных больших языковых моделей (LLM), которые генерируют текст, модели встраивания преобразуют текст в числовые векторы. Эти векторы имеют решающее значение для построения систем генерации с расширенным поиском (RAG) , которые позволяют находить наиболее релевантные документы для запроса пользователя.
Что вы будете делать
- Контейнеризация модели EmbeddingGemma с использованием Ollama .
- Разверните контейнер в Cloud Run с ускорением на графическом процессоре.
- Протестируйте развернутую модель, сгенерировав векторные представления для примеров текста.
- Создайте легковесную систему семантического поиска, используя развернутый вами сервис.
Что вам понадобится
- Проект Google Cloud с включенной функцией выставления счетов.
- Базовые знания Docker и командной строки.
2. Прежде чем начать
Настройка проекта
- Если у вас еще нет учетной записи Google, вам необходимо ее создать .
- Используйте личный аккаунт вместо рабочего или учебного. Рабочие и учебные аккаунты могут иметь ограничения, которые не позволят вам включить API, необходимые для этой лабораторной работы.
- Войдите в консоль Google Cloud .
- Включите выставление счетов в облачной консоли.
- Выполнение этой лабораторной работы должно обойтись менее чем в 1 доллар США в виде облачных ресурсов.
- В конце этой лабораторной работы вы можете выполнить действия по удалению ресурсов, чтобы избежать дальнейших списаний средств.
- Новые пользователи могут воспользоваться бесплатной пробной версией стоимостью 300 долларов США .
- Создайте новый проект или выберите вариант повторного использования существующего проекта.
- Если вы видите ошибку, связанную с квотой проекта, используйте существующий проект повторно или удалите существующий проект, чтобы создать новый.
Запустить Cloud Shell
Cloud Shell — это среда командной строки, работающая в Google Cloud и поставляемая с предустановленными необходимыми инструментами.
- В верхней части консоли Google Cloud нажмите кнопку «Активировать Cloud Shell» .
- После подключения к Cloud Shell подтвердите свою аутентификацию:
gcloud auth list - Подтвердите, что ваш проект выбран:
gcloud config get project - При необходимости установите значение:
gcloud config set project <YOUR_PROJECT_ID>
Включить API
Выполните эту команду, чтобы включить все необходимые API:
gcloud services enable \
run.googleapis.com \
artifactregistry.googleapis.com \
cloudbuild.googleapis.com
3. Контейнеризация модели
Для бессерверной работы EmbeddingGemma нам необходимо упаковать его в контейнер. Мы будем использовать Ollama , легковесный фреймворк для запуска LLM-приложений, и Docker .
Создайте Dockerfile.
В Cloud Shell создайте новую директорию для своего проекта и перейдите в неё:
mkdir embedding-gemma-codelab
cd embedding-gemma-codelab
Создайте файл с именем Dockerfile со следующим содержимым:
FROM ollama/ollama:latest
# Listen on all interfaces, port 8080
ENV OLLAMA_HOST=0.0.0.0:8080
# Store model weight files in /models
ENV OLLAMA_MODELS=/models
# Reduce logging verbosity
ENV OLLAMA_DEBUG=false
# Never unload model weights from the GPU
ENV OLLAMA_KEEP_ALIVE=-1
# Store the model weights in the container image
ENV MODEL=embeddinggemma:latest
RUN ollama serve & sleep 5 && ollama pull $MODEL
# Start Ollama
ENTRYPOINT ["ollama", "serve"]
Этот Dockerfile делает следующее:
- Начинается с официального базового изображения Олламы.
- Настраивает Ollama для прослушивания порта 8080 (порт по умолчанию в Cloud Run).
- Команда
RUNзапускает серверollamaи загружает модельembeddinggemmaв процессе сборки, чтобы она была встроена в образ. - Устанавливает
OLLAMA_KEEP_ALIVE=-1, чтобы гарантировать, что модель останется загруженной в память графического процессора для более быстрой обработки последующих запросов.
4. Сборка и развертывание
Для сборки и развертывания нашего контейнера за один шаг мы будем использовать развертывание из источника Cloud Run . Эта команда собирает образ с помощью Cloud Build, сохраняет его в реестре артефактов и развертывает в Cloud Run.
Для развертывания выполните следующую команду:
gcloud run deploy embedding-gemma \
--source . \
--region europe-west1 \
--concurrency 4 \
--cpu 8 \
--set-env-vars OLLAMA_NUM_PARALLEL=4 \
--gpu 1 \
--gpu-type nvidia-l4 \
--max-instances 1 \
--memory 32Gi \
--no-allow-unauthenticated \
--no-cpu-throttling \
--no-gpu-zonal-redundancy \
--timeout=600 \
--labels dev-tutorial=codelab-embedding-gemma
Понимание конфигурации
-
--source .указывает текущий каталог в качестве источника для сборки. -
--region europe-west1Мы используем регион, поддерживающий графические процессоры в Cloud Run. -
--concurrency 4установлен в соответствии со значением переменной среды OLLAMA_NUM_PARALLEL. -
--gpu 1с--gpu-type nvidia-l4назначает каждому экземпляру Cloud Run в сервисе 1 графический процессор NVIDIA L4. -
--max-instances 1задает максимальное количество экземпляров для масштабирования. Оно должно быть равно или меньше квоты NVIDIA L4 GPU вашего проекта. -
--no-allow-unauthenticatedограничивает неаутентифицированный доступ к сервису. Сохраняя сервис приватным, вы можете полагаться на встроенную в Cloud Run систему аутентификации Identity and Access Management (IAM) для взаимодействия между сервисами. - Для включения графического процессора требуется
--no-cpu-throttling. -
--no-gpu-zonal-redundancyустанавливает параметры зонального резервирования в зависимости от требований к зональному отказоустойчивости и доступной квоты.
Региональные особенности
Графические процессоры в Cloud Run доступны в определенных регионах. Список поддерживаемых регионов можно посмотреть в документации .
Результаты развертывания
Через несколько минут развертывание завершится, и вы увидите сообщение следующего вида:
Service [embedding-gemma] revision [embedding-gemma-12345-abc] has been deployed and is serving 100 percent of traffic. Service URL: https://embedding-gemma-123456789012.europe-west1.run.app
5. Проверьте развертывание.
Поскольку мы развернули сервис с --no-allow-unauthenticated , мы не можем просто curl для доступа к общедоступному URL-адресу. Сначала нам необходимо предоставить себе разрешение на доступ к сервису и использовать токен аутентификации в запросе.
- Предоставьте своей учетной записи пользователя разрешение на вызов сервиса:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member=user:$(gcloud config get-value account) \ --role='roles/run.invoker' - Сохраните свои учетные данные Google Cloud и номер проекта в переменных среды для использования в запросе:
export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)") export ID_TOKEN=$(gcloud auth print-identity-token) - Выполните следующую команду, чтобы сгенерировать векторное представление для "Примера текста":
curl -X POST "https://embedding-gemma-$PROJECT_NUMBER.europe-west1.run.app/api/embed" \ -H "Authorization: Bearer $ID_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "model": "embeddinggemma", "input": "Sample text" }'
В ответе JSON под полем embedding вы должны увидеть вектор (длинный список чисел). Это подтверждает работоспособность вашей бессерверной модели встраивания данных с использованием графического процессора!
Ответ будет выглядеть примерно так: 
Клиент на Python
Для взаимодействия со сервисом можно также использовать Python. Создайте файл с именем test_client.py :
import urllib.request
import urllib.parse
import json
import os
# 1. Setup the URL and Payload
url = f"https://embedding-gemma-{os.environ['PROJECT_NUMBER']}.europe-west1.run.app/api/embed"
payload = {
"model": "embeddinggemma",
"input": "Sample text"
}
# 2. Create the Request object
# Note: Providing 'data' automatically makes this a POST request
req = urllib.request.Request(
url,
data=json.dumps(payload).encode("utf-8"),
headers={
"Authorization": f"Bearer {os.environ['ID_TOKEN']}",
"Content-Type": "application/json"
}
)
# 3. Execute and print the response
response = urllib.request.urlopen(req)
result = json.loads(response.read().decode("utf-8"))
print(result)
Запустите его:
python test_client.py
6. Создайте приложение для семантического поиска.
Теперь, когда у нас есть работающий сервис встраивания, давайте создадим простое приложение для семантического поиска . Мы будем использовать сгенерированные встраивания для поиска наиболее релевантного документа для заданного запроса.
Зависимости
В качестве векторной базы данных мы будем использовать chromadb и клиентскую библиотеку ollama .
uv init semantic-search --description "Semantic Search Application"
cd semantic-search
uv add chromadb ollama
Создайте приложение для поиска.
Создайте файл с именем semantic_search.py , содержащий следующий код:
import ollama
import chromadb
import os
# 1. Define our knowledge base
documents = [
"Poland is a country located in Central Europe.",
"The capital and largest city of Poland is Warsaw.",
"Poland's official language is Polish, which is a West Slavic language.",
"Marie Curie, the pioneering scientist who conducted groundbreaking research on radioactivity, was born in Warsaw, Poland.",
"Poland is famous for its traditional dish called pierogi, which are filled dumplings.",
"The Białowieża Forest in Poland is one of the last and largest remaining parts of the immense primeval forest that once stretched across the European Plain.",
]
print("Initializing Vector Database...")
client = chromadb.Client()
collection = client.create_collection(name="docs")
# Configure the client to point to our Cloud Run proxy
ollama_client = ollama.Client(
host=f"https://embedding-gemma-{os.environ['PROJECT_NUMBER']}.europe-west1.run.app",
headers={'Authorization': 'Bearer ' + os.environ['ID_TOKEN']}
)
print("Generating embeddings and indexing documents...")
# 2. Store each document in the vector database
for i, d in enumerate(documents):
# This calls our Cloud Run service to get the embedding
response = ollama_client.embed(model="embeddinggemma", input=d)
embeddings = response["embeddings"]
collection.add(ids=[str(i)], embeddings=embeddings, documents=[d])
print("Indexing complete.\n")
# 3. Perform a Semantic Search
question = "What is Poland's official language?"
print(f"Query: {question}")
# Generate an embedding for the question
response = ollama_client.embed(model="embeddinggemma", input=question)
# Query the database for the most similar document
results = collection.query(
query_embeddings=[response["embeddings"][0]],
n_results=1
)
best_match = results["documents"][0][0]
print(f"Best Match Document: {best_match}")
Запустите приложение
Выполните скрипт:
uv run semantic_search.py
В результате вы должны увидеть примерно следующее:
Initializing Vector Database...
Generating embeddings and indexing documents...
Indexing complete.
Query: What is Poland's official language?
Best Match Document: Poland's official language is Polish, which is a West Slavic language.
Этот скрипт демонстрирует суть системы RAG: использование вашего бессерверного сервиса EmbeddingGemma для преобразования документов и запросов в векторы, что позволяет находить именно ту информацию, которая необходима для ответа на вопрос пользователя.
7. Уборка
Чтобы избежать дальнейших списаний средств с вашего аккаунта Google Cloud, удалите ресурсы, созданные в ходе этого практического занятия.
Удалите службу Cloud Run.
gcloud run services delete embedding-gemma --region europe-west1 --quiet
Удалите изображение контейнера
gcloud artifacts docker images delete \
europe-west1-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/cloud-run-source-deploy/embedding-gemma \
--quiet
8. Поздравляем!
Поздравляем! Вы успешно развернули EmbeddingGemma в Cloud Run с использованием графических процессоров и применили его для работы приложения семантического поиска.
Теперь у вас есть масштабируемая бессерверная основа для создания приложений искусственного интеллекта, требующих понимания смысла текста.
Что вы узнали
- Как контейнеризировать модель Ollama с помощью Docker.
- Как развернуть сервис с поддержкой графического процессора в Cloud Run.
- Как использовать развернутую модель для семантического поиска (RAG).
Следующие шаги
- Ознакомьтесь с другими моделями из семейства Gemma .
- Узнайте больше о графических процессорах Cloud Run .
- Ознакомьтесь с другими примерами кода Cloud Run .
- Создайте полноценный конвейер RAG, связав этот этап извлечения данных с генеративной моделью.