试用机器翻译

本页面将逐步介绍如何使用 Vertex AI API 将文本从一种语言翻译成另一种语言。

在此示例中,您部署工作负载时未使用 GPU。如需使用 GPU 进行部署,请按照部署 GPU 容器工作负载中的步骤操作。

Translation API

以下示例演示了如何使用 Vertex AI 进行文本翻译。

  1. 请确保您已按照使用 Vertex AI 中的说明设置 Vertex AI 访问权限。
  2. 按照《Vertex AI 快速入门:使用客户端库》中的说明设置 Python Vertex AI API。如需了解详情,请参阅 Vertex AI Python API 参考文档

  3. 创建 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)
    
  4. 创建一个包含 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"]
    
  5. 为翻译应用构建 Docker 映像:

    docker build -t translation-app .
    
  6. 按照配置 Docker 中的说明执行以下操作:

    1. 配置 Docker,
    2. 创建 Secret,并
    3. 将映像上传到 HaaS(Harbor 即服务)。
  7. 登录用户集群并使用用户身份生成其 kubeconfig 文件。确保您已将 kubeconfig 路径设置为环境变量:

    export KUBECONFIG=${CLUSTER_KUBECONFIG_PATH}
    
  8. 创建并部署 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 的名称。
  9. 验证部署是否已创建 Pod:

    kubectl --kubeconfig ${KUBECONFIG} get pods -n TENANT_PROJECT
    
  10. 创建网络政策以允许所有网络流量流向租户项目:

    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
    
  11. 导出服务的 IP 地址:

    export IP=`kubectl --kubeconfig=${KUBECONFIG} get service nginx-service \
          -n TENANT_PROJECT -o jsonpath='{.status.loadBalancer.ingress[*].ip}'`
    
  12. 创建与已部署工作负载的 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
    
  13. 通过以下方式测试服务:使用 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