기계 번역 사용해 보기

이 페이지에서는 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. main.py Python 파일을 만듭니다. 이 스크립트는 컨테이너 엔드포인트를 사용하여 액세스하는 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 배포 및 서비스 커스텀 리소스를 만들고 배포합니다. 컨테이너 이그레스를 사용 설정하려면 이 예와 같이 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. 포드가 배포에 의해 생성되었는지 확인합니다.

    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