试用机器翻译

Cloud Translation API 可让您在不同语言之间动态翻译文本。在本教程中,您将在不使用 GPU 的情况下,在 Google Distributed Cloud (GDC) Sandbox 中部署容器化翻译服务。

如需改为运行 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 as a Service)。
  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 是否已由 Deployment 创建:

    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. 通过向 http://${IP}:8080/translate 发送包含文本和目标语言的 JSON 载荷来测试服务,使用 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