이 페이지에서는 Vertex AI API를 사용하여 텍스트를 한 언어에서 다른 언어로 번역하는 예를 안내합니다.
이 예에서는 GPU를 사용하지 않고 워크로드를 배포합니다. GPU를 사용하여 배포하려면 GPU 컨테이너 워크로드 배포의 단계를 따르세요.
Translation API
다음 샘플에서는 텍스트 번역을 위해 Vertex AI를 사용하는 방법을 보여줍니다.
- Vertex AI 사용에 설명된 대로 Vertex AI 액세스를 설정해야 합니다.
Vertex AI 빠른 시작: 클라이언트 라이브러리 사용의 안내에 따라 Python Vertex AI API를 설정합니다. 자세한 내용은 Vertex AI Python API 참조 문서를 확인하세요.
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)
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 --dns
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