本页面将逐步介绍如何使用 Vertex AI API 将文本从一种语言翻译成另一种语言。
在此示例中,您部署工作负载时未使用 GPU。如需使用 GPU 进行部署,请按照部署 GPU 容器工作负载中的步骤操作。
Translation API
以下示例演示了如何使用 Vertex AI 进行文本翻译。
- 请确保您已按照使用 Vertex AI 中的说明设置 Vertex AI 访问权限。
按照《Vertex AI 快速入门:使用客户端库》中的说明设置 Python Vertex AI API。如需了解详情,请参阅 Vertex AI Python API 参考文档。
创建 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)
创建一个包含 Python 脚本的 Docker 文件:
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,
- 创建 Secret,并
- 将映像上传到 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
:Harbor 实例网址。HARBOR_PROJECT
:Harbor 项目。SECRET
:为存储 Docker 凭据而创建的 Secret 的名称。
验证部署是否已创建 Pod:
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
通过以下方式测试服务:使用 POST 请求将包含文本和目标语言的 JSON 载荷发送到
http://${IP}:8080/translate
,并将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