בדף הזה מוסבר איך להשתמש ב-Vertex AI API כדי לתרגם טקסט משפה אחת לשפה אחרת.
בדוגמה הזו, אתם פורסים את עומסי העבודה בלי להשתמש במעבדי GPU. כדי לבצע פריסה באמצעות יחידות GPU, פועלים לפי השלבים במאמר בנושא פריסת עומסי עבודה של קונטיינרים של GPU.
Translation API
בדוגמה הבאה מוצג שימוש ב-Vertex AI לתרגום טקסט.
- חשוב לוודא שהגדרתם גישה ל-Vertex AI כמו שמתואר במאמר שימוש ב-Vertex AI.
מגדירים את Python Vertex AI API לפי ההוראות שבמדריך לתחילת העבודה עם Vertex AI באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של ה-API בשפת Python של Vertex AI.
יוצרים קובץ Python
main.py. הסקריפט הזה משתמש ב- Google CloudTranslation API, שאליו ניגשים באמצעות נקודת קצה של מאגר, כדי לבצע תרגומים.import os import requests # Use requests for HTTP calls from flask import Flask, request, jsonify app = Flask(__name__) TRANSLATE_API_URL = 'https://translation.googleapis.com/language/translate/v2' @app.route('/translate', methods=['POST']) def translate_text(): try: data = request.get_json() text_to_translate = data.get('text') target_language = data.get('target_language', 'en') # Default to English if not text_to_translate: return jsonify({'error': 'Missing "text" in request body'}), 400 params = { 'key': '${API_KEY}', // insert API key 'q': text_to_translate, 'target': target_language } response = requests.post(TRANSLATE_API_URL, params=params) response.raise_for_status() # Raise an exception for bad status codes (4xx or 5xx) result = response.json() # The structure of the response from the REST API is slightly different # It's usually: {'data': {'translations': [{'translatedText': '...', 'detectedSourceLanguage': '...'}]}} if 'data' in result and 'translations' in result['data'] and len(result['data']['translations']) > 0: translation_info = result['data']['translations'][0] return jsonify({ 'original_text': text_to_translate, 'translated_text': translation_info['translatedText'], 'detected_source_language': translation_info.get('detectedSourceLanguage') }) else: return jsonify({'error': 'Unexpected response format from Translation API', 'details': result}), 500 except requests.exceptions.HTTPError as http_err: print(f"HTTP error occurred: {http_err} - {response.text}") return jsonify({'error': f"Translation API request failed: {http_err}", 'details': response.text}), response.status_code except Exception as e: print(f"Error during translation: {e}") return jsonify({'error': str(e)}), 500 if __name__ == '__main__': port = int(os.environ.get('PORT', 8080)) app.run(debug=True, host='0.0.0.0', port=port)יוצרים קובץ Docker שמכיל את סקריפט Python:
FROM python:3.9-slim WORKDIR /app COPY . /app RUN pip install --no-cache-dir -r requirements.txt EXPOSE 8080 ENV PORT 8080 CMD ["python", "main.py"]יוצרים את קובץ האימג' של Docker לאפליקציית התרגום:
docker build -t translation-app .פועלים לפי ההוראות במאמר הגדרת Docker כדי:
- מגדירים את Docker,
- יוצרים סוד, ו
- מעלים את התמונה ל-HaaS (Harbor כשירות).
נכנסים לאשכול המשתמשים ויוצרים את קובץ ה-kubeconfig שלו עם זהות משתמש. חשוב להגדיר את הנתיב של kubeconfig כמשתנה סביבה:
export KUBECONFIG=${CLUSTER_KUBECONFIG_PATH}יצירה ופריסה של משאבים מותאמים אישית של Kubernetes Deployment ו-Service. כדי להפעיל יציאה של קונטיינר, חשוב לכלול את התווית
egress.networking.gke.io/enabled: "true", כמו בדוגמה הזו.kubectl --kubeconfig ${KUBECONFIG} -n TENANT_PROJECT \ create -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: translation-deployment-apikey spec: replicas: 2 selector: matchLabels: app: translation-apikey template: metadata: labels: app: translation-apikey egress.networking.gke.io/enabled: "true" spec: dnsConfig: nameservers: - 8.8.8.8 containers: - name: translation-app image: HARBOR_INSTANCE_URL/HARBOR_PROJECT/translation-app:latest ports: - containerPort: 8080 imagePullSecrets: - name: SECRET --- apiVersion: v1 kind: Service metadata: name: translation-service-apikey spec: type: LoadBalancer selector: app: translation-apikey ports: - protocol: TCP port: 80 targetPort: 8080 EOFמחליפים את מה שכתוב בשדות הבאים:
-
HARBOR_INSTANCE_URL: כתובת ה-URL של מופע Harbor. -
HARBOR_PROJECT: פרויקט Harbor. -
SECRET: השם של הסוד שנוצר לאחסון פרטי הכניסה של Docker.
-
בודקים שה-pods נוצרו על ידי הפריסה:
kubectl --kubeconfig ${KUBECONFIG} get pods -n TENANT_PROJECTיוצרים מדיניות רשת כדי לאפשר את כל תעבורת הנתונים ברשת לפרויקט הדייר:
kubectl --kubeconfig ${KUBECONFIG} -n TENANT_PROJECT \ create -f - <<EOF apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: annotations: name: allow-all spec: ingress: - from: - ipBlock: cidr: 0.0.0.0/0 podSelector: {} policyTypes: - Ingress EOFמייצאים את כתובת ה-IP של השירות:
export IP=`kubectl --kubeconfig=${KUBECONFIG} get service nginx-service \ -n TENANT_PROJECT -o jsonpath='{.status.loadBalancer.ingress[*].ip}'`יוצרים סשן של מנהרת SSH לעומס העבודה שפרסתם.
sshuttle -r zone1-org-1-data@GDC_SANDBOX_INSTANCE_NAME --no-latency-control \ --ssh-cmd 'gcloud compute ssh --project PROJECT_NAME --zone ZONE --tunnel-through-iap' \ 10.200.0.0/16 --dnsבודקים את השירות על ידי שליחת מטען ייעודי (payload) בפורמט JSON עם הטקסט ושפת היעד אל
http://${IP}:8080/translate, באמצעות בקשת POST עם הכותרתContent-Typeשמוגדרת לערךapplication/json. הפקודה הבאה של curl תתרגם את המחרוזת Hello, world! לספרדית (es):curl -X POST -H "Content-Type: application/json" -d '{"text": "Hello, world\\!", "target\_language": "es"}' http://${IP}:8080/translate