Cloud Translation API를 사용하면 언어 간에 텍스트를 동적으로 번역할 수 있습니다. 이 튜토리얼에서는 GPU가 없는 Google Distributed Cloud(GDC) 샌드박스에 컨테이너화된 번역 서비스를 배포합니다.
대신 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 구성
- 보안 비밀을 만들고
- 이미지를 HaaS(Harbor as a Service)에 업로드합니다.
사용자 클러스터에 로그인하고 사용자 ID로 kubeconfig 파일을 생성합니다. kubeconfig 경로를 환경 변수로 설정해야 합니다.
export KUBECONFIG=${CLUSTER_KUBECONFIG_PATH}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 사용자 인증 정보를 저장하기 위해 만든 보안 비밀의 이름입니다.
배포에서 포드가 생성되었는지 확인합니다.
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 --dnsContent-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