機械翻訳を試す

このページでは、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. シークレットを作成する。
    3. イメージを HaaS(Harbor as a Service)にアップロードします。
  7. ユーザー クラスタにログインし、ユーザー ID を使用して 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 インスタンスの URL。
    • HARBOR_PROJECT: Harbor プロジェクト。
    • SECRET: Docker 認証情報を保存するために作成されたシークレットの名前。
  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. Content-Type ヘッダーを application/json に設定した POST リクエストを使用して、テキストとターゲット言語を含む JSON ペイロードを http://${IP}:8080/translate に送信して、サービスをテストします。次の curl コマンドは、「Hello, world!」をスペイン語(es)に変換します。

    curl -X POST -H "Content-Type: application/json" -d '{"text": "Hello, world\\!", "target\_language": "es"}' http://${IP}:8080/translate