쉽고 편리하게 ML/DL(Machine Learning/Deep Learning) 모델 개발 및 학습 환경을 구축할 수 있는 AI/ML 서비스를 제공합니다.
이 섹션의 다중 페이지 출력 화면임. 여기를 클릭하여 프린트.
AI-ML
- 1: Simple AI Inference
- 1.1: Overview
- 1.1.1: ServiceWatch 지표
- 1.2: How-to Guides
- 1.3: References
- 1.3.1: API Reference
- 1.4: Data Privacy
- 1.5: Release Note
- 2: Simple AI Training
- 2.1: Overview
- 2.1.1: 서버 타입
- 2.1.2: ServiceWatch 지표
- 2.2: How-to guides
- 2.2.1: Job Failover 사용하기
- 2.2.2: Concurrent Checkpointing
- 2.3: Release Note
- 3: CloudML
- 3.1: Overview
- 3.2: How-to guides
- 3.2.1: Kubernetes 클러스터 구성
- 3.3: API Reference
- 3.4: CLI Reference
- 3.5: Release Note
- 4: AI&MLOps Platform
- 4.1: Overview
- 4.2: How-to guides
- 4.2.1: 클러스터 배포
- 4.2.2: Kubeflow 사용 가이드
- 4.3: API Reference
- 4.4: CLI Reference
- 4.5: Release Note
1 - Simple AI Inference
1.1 - Overview
서비스 개요
Simple AI Inference는 다양한 글로벌 파운데이션 모델을 API 형태로 제공하는 Serverless 서비스로써 LLM을 Samsung Cloud Platform 내부 자원이나 외부에서 사용할 수 있도록 Public 또는 Private 환경을 제공합니다.
Simple AI Inference를 이용하면 동일 API를 통해 여러 LLM 모델을 사용하고 AI 애플리케이션 서비스 개발 생산성을 향상시킬 수 있습니다. 또한 OpenAI 및 LangChain SDK와 호환성을 지원하여 기존 개발 환경 및 프레임워크에 손쉽게 연동할 수 있습니다.
특장점
- 편리한 LLM 모델 사용: Serverless 형태의 완전 관리형 서비스로써 동일 API를 통해 여러 LLM 모델을 사용할 수 있습니다.
- 효율적인 비용관리: 입력(Input) 및 출력(Output) 토큰의 실제 사용량을 기준으로 비용이 과금됩니다.
- 안정적인 서비스 제공: 트래픽 컨트롤(TPM/RTM)을 통하여 안정적인 서비스를 제공합니다.
- 기업용 보안 제공: 데이터는 철저한 보안 환경에서 안전하게 보호되며 외부 모델 학습에 사용되지 않습니다.
서비스 구성도
제공 기능
Simple AI Inference는 다음과 같은 기능을 제공하고 있습니다.
편리한 LLM 모델 확인
- LLM 모델 카탈로그를 통해 제공되는 LLM 모델의 특징 및 주요 활용처들을 쉽게 확인할 수 있습니다.
- PlayGround를 이용하여 제공되는 LLM 모델을 콘솔 화면에서 바로 확인하고 테스트할 수 있습니다.참고PlayGround는 2026년 9월 이후 제공될 예정입니다.
LLM 모델의 Account 공동 사용: Simple AI Inference에서 사용할 모델을 신청하면 동일 Account 내의 모든 사용자가 사용할 수 있습니다.
Serverless 서비스 제공 : 사용자는 자원의 관리 없이 API를 통해 원하는 모델을 요청하여 바로 사용할 수 있으며 사용한 만큼 비용을 지불하게 됩니다.
Public/Private 엔드 포인트 제공: 사용자의 추론 사용 형태에 따라 Public 또는 Private 엔드 포인트를 선택하여 사용할 수 있습니다.
안정적인 서비스 제공: 트래픽 컨트롤(TPM/RPM)을 통해 안정적인 서비스 환경을 제공합니다.
제공 모델
Simple AI Inference에서 제공하는 LLM 모델은 다음과 같습니다.
| 모델명 | 활용처 | 입력 타입 | TPM | RPM | Context Size | 이미지 입력 제한 수 |
|---|---|---|---|---|---|---|
| Qwen3.6-27B | Text, Agent | Text, Image | 1,000,000 | 100 | 262,144 | 8 |
| gemma-4-31B-it | Text, Agent | Text, Image | 1,000,000 | 100 | 262,144 | 8 |
| gpt-oss-120b | Text | Text | 1,000,000 | 100 | 131,072 | - |
| Llama-Guard-4-12B | Security | Text, Image | 1,000,000 | 250 | 307,200 | 8 |
| Qwen3-VL-Embedding-8B | embedding | Text, Image | 1,000,000 | 250 | 262,144 | 8 |
| Qwen3-VL-Reranker-8B | reranker | Text, Image | 1,000,000 | 250 | 262,144 | 8 |
리전별 제공 현황
Simple AI Inference 서비스를 제공하는 리전은 다음과 같습니다.
| 리전 | 제공 여부 |
|---|---|
| 한국 서부(kr-west1) | 제공 |
| 한국 동부(kr-east1) | 미제공 |
| 한국 남부1(kr-south1) | 미제공 |
| 한국 남부2(kr-south2) | 미제공 |
| 한국 남부3(kr-south3) | 미제공 |
선행 서비스
해당 서비스를 생성하기 전에 미리 구성되어 있어야 하는 서비스는 없습니다.
1.1.1 - ServiceWatch 지표
Simple AI Inference은 ServiceWatch로 지표를 전송합니다. 기본 모니터링으로 제공되는 지표는 5분 주기로 수집된 데이터입니다.
기본 지표
다음은 네임스페이스 Simple AI Inference에 대한 기본 지표입니다.
아래에서 지표명이 굵은 글씨로 표기된 지표는 Simple AI Inference에서 제공하는 기본 지표 중 주요 지표로 선정한 지표입니다.
주요 지표는 ServiceWatch에서 서비스별로 자동으로 구축되는 서비스 대시보드를 구성하는데 활용됩니다.
각 지표는 해당 지표를 조회할 때 어떤 통계값으로 조회하는 것이 의미있는지 의미 있는 통계값을 사용자 가이드를 통해 안내하고 있으며, 의미있는 통계 중에서 굵은 글씨로 표기된 통계값이 주요 통계값입니다.
서비스 대시보드 또는 모니터링 탭에서는 주요 지표를 주요 통계값을 통해 조회할수 있습니다. 또는 Simple AI Inference 상세 페이지의 모니터링 탭에서도 주요 지표에 대해 확인할 수 있습니다.
ServiceWatch의 지표 메뉴에서 GPU Device별 사용률도 확인할 수 있습니다.
| 성능 항목(지표명) | 상세 설명 | 단위 | 의미있는 통계 |
|---|---|---|---|
| Model Total Tokens | 모델 토큰 사용량(전체) | Count |
|
| Model Request Server Error | 모델 요청 실패 횟수(서버 오류) | Count |
|
| Model Input Tokens | 모델 토큰 사용량(입력, 캐시된 토큰 포함) | Count |
|
| Model Request Throttled | 모델 요청 제한 횟수(요청 한도 초과) | Count |
|
| Model Request Client Error | 모델 요청 실패 횟수(클라이언트 오류) | Count |
|
| Model Output Tokens | 모델 토큰 사용량(출력) | Count |
|
| Model Cached Tokens | 모델 토큰 사용량(캐시) | Count |
|
| Model Request Prompt Rejected | 모델 요청 거부 횟수(프롬프트 검수) | Count |
|
| Model Request Success | 모델 요청 성공 횟수 | Count |
|
1.2 - How-to Guides
Simple AI Inference 생성하기
Simple AI Inference를 이용하려면 먼저 Inference를 생성해야 합니다. Inference를 생성하려면 다음 절차를 따르세요.
모든 서비스 > AI-ML > Simple AI Inference 메뉴를 클릭하세요. Simple AI Inference의 Service Home 페이지로 이동합니다.
Service Home 페이지에서 Simple AI Inference 생성 버튼을 클릭하세요. Serverless Inference 생성 페이지로 이동합니다.
Serverless Inference 생성 페이지에서 서비스 생성에 필요한 정보들을 입력하고, 상세 옵션을 선택하세요.
- 서비스 정보 입력 영역에서 서비스 생성에 필요한 옵션을 선택하세요.
구분 필수 여부상세 설명 Inference 서비스명 필수 Serverless Inference 서비스명 입력 - 영문 소문자와 숫자를 사용해 3 ~ 25자로 입력
엔드포인트 필수 Simple AI Inference에 대한 외부 엑세스를 선택 - 프라이빗: 프라이빗 엔드포인트 접근 제어만 사용
- 프라이빗&퍼블릭: 프라이빗과 퍼블릭 엔드포인트 접근 제어 모두 사용
프라이빗 엔드 포인트 접근 제어 선택 Samsung Cloud Platform내 리소스를 추가하여 해당 리소스의 접근만 허용 - 프라이빗 접근 허용 리소스: 접근을 허용할 리소스를 선택
- 추가 버튼을 클릭하여 접근을 허용할 리소스 선택 가능
- 리소스 목록에서 삭제할 리소스를 선택한 후, 삭제 버튼을 클릭하여 삭제 가능
- 리소스를 추가하지 않을 경우, 동일 리전에 포함된 모든 서브넷 상의 리소스에 대한 접근을 허용
- Serverless 엔드 포인트 신청 후 수정 가능
퍼블릭 엔드 포인트 접근 제어 선택 퍼블릭 엔드 포인트 접근 제어의 사용 여부를 설정 - 사용으로 설정할 경우, 접근을 허용할 IP 또는 리소스 추가 가능
- 퍼블릭 접근 허용 IP: 접근을 허용할 IP 대역을 CIDR 형식 또는 IP 주소로 입력한 후, 추가 버튼을 클릭하여 추가 가능
- 최대 100개까지 추가 가능
- 사용하지 않을 경우, 모든 IP에 대한 접근을 허용
- Serverless 엔드 포인트 신청 후 수정 가능
표. Serverless Inference 서비스 정보 입력 항목주의퍼블릭 엔드 포인트 접근 제어를 사용하지 않거나 전체 IP 범위(Any, 0.0.0.0/0)로 설정할 경우, 레지스트리가 외부 스캔 및 해킹 등의 보안 공격에 노출될 수 있습니다. - 추가 정보 입력 영역에서 필요한 정보를 입력 또는 선택하세요.
구분 필수 여부상세 설명 태그 선택 태그 추가 - 자원 당 최대 50개까지 추가 가능
- 태그 추가 버튼을 클릭한 후 Key, Value 값을 입력 또는 선택
표. Serverless Inference 추가 정보 입력 항목
- 서비스 정보 입력 영역에서 서비스 생성에 필요한 옵션을 선택하세요.
요약 패널에서 생성한 상세 정보와 예상 청구 금액을 확인하고, 생성 버튼을 클릭하세요.
생성을 알리는 팝업창이 열리면 확인 버튼을 클릭하세요. 생성 신청이 완료됩니다.
- 생성이 완료되면, Serverless Inference 목록 페이지에서 생성한 내용을 확인하세요.
LLM 모델별 사용량 확인하기
Simple AI Inference의 Service Home 페이지에서 LLM 목록과 모델별 Token 사용량을 확인할 수 있습니다.
- 모든 서비스 > AI-ML > Simple AI Inference 메뉴를 클릭하세요. Simple AI Inference의 Service Home 페이지로 이동합니다.
- Service Home 페이지의 대시보드에서 LLM 모델별 사용량 목록에서 LLM의 모델별 사용량을 확인하세요.
구분 상세 설명 모델명 LLM 이름 - 이름을 클릭하면 해당 모델의 상세 페이지 내 Report 탭으로 이동
모델 타입 LLM 타입 - 모델별 정보는 제공 모델 참고
사용 토큰량(1 Week) 현재일 기준으로 1주일간 사용한 토큰량 표. Simple AI Inference LLM 모델별 사용량 항목
Serverless Inference 상세 정보 확인하기
Serverless Inference의 상세 정보를 확인하려면 다음 절차를 따르세요.
- 모든 서비스 > AI-ML > Simple AI Inference 메뉴를 클릭하세요. Simple AI Inference의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Serverless Inference 메뉴를 클릭하세요. Serverless Inference 목록 페이지로 이동합니다.
항목 설명 서비스 생성 Serverless Inference 생성 가능 - 버튼 클릭 시 Serverless Inference 생성 페이지로 이동
- 생성 방법은 Simple AI Inference 생성하기 참고
Inference 서비스명 Serverless Inference 이름 모델 ID 모델 ID값 - 모델 ID 클릭 시 해당 모델의 상세 페이지로 이동
- 모델에 대한 상세 정보는 모델 상세 정보 확인하기 참고
모델명 모델 이름 - 모델 ID 클릭 시 해당 모델의 상세 페이지로 이동
- 모델에 대한 상세 정보는 모델 상세 정보 확인하기 참고
모델 종료 예정 일자 모델의 제공 종료 예정 일자 지연 시간 평균 응답 시간 처리량 모델이 1초당 평균적으로 생성하는 토큰 수 서비스 해지 Serverless Inference 해지 가능 - 버튼 클릭 시 Serverless Inference 해지 페이지로 이동
- 해지 방법은 Inference 해지하기 참고
표. Serverless Inference 목록 정보참고모델 ID 또는 모델명을 클릭하면 모델 카탈로그의 모델 상세 정보 페이지로 이동하여 모델의 상세정보를 확인할 수 있습니다.
- Serverless Inference 목록 페이지에서 상세정보를 확인할 Inference 서비스명을 클릭하세요. Serverless Inference 상세 페이지로 이동합니다.
- Serverless Inference 상세 페이지는 상세정보, Report, 태그, 작업 이력 탭으로 구성되어 있습니다.
상세 정보
Serverless Inference 목록 페이지에서 선택한 자원의 상세 정보를 확인하고, 필요한 경우 정보를 수정할 수 있습니다.
| 구분 | 상세 설명 |
|---|---|
| 서비스 | 서비스명 |
| 자원 유형 | 자원 유형 |
| SRN | Samsung Cloud Platform에서의 고유 자원 ID |
| 자원명 | 자원 이름 |
| 자원 ID | 서비스에서의 고유 자원 ID |
| 생성자 | 서비스를 생성한 사용자 |
| 생성 일시 | 서비스를 생성한 일시 |
| 수정자 | 서비스 정보를 수정한 사용자 |
| 수정 일시 | 서비스 정보를 수정한 일시 |
| 엔드포인트 | Simple AI Inference에 대한 외부 엑세스 방식
|
| 프라이빗 엔드포인트 | 프라이빗 엔드포인트값
|
| 퍼블릭 엔드포인트 | 퍼블릭 엔드포인트값
|
| 프라이빗 엔드포인트 접근 제어 | 프라이빗 접근이 허용된 리소스 정보
|
| 퍼블릭 엔드포인트 접근 제어 | 퍼블릭 접근이 허용된 IP 및 리소스 정보
|
Report
Serverless Inference 목록 페이지에서 선택한 자원의 일자별 LLM 호출 횟수와 토큰 사용량을 확인할 수 있습니다.
| 구분 | 상세 설명 |
|---|---|
| 검색 필터 | Report를 확인할 항목 선택
|
| 호출 횟수 | 조회 기간 동안 호출 횟수를 그래프로 표시 |
| 전체 호출 횟수 | 조회 기간 동안 호출 횟수를 모델별로 제공 |
| Token 사용량 | 조회 기간 동안 Input 및 Output Token 사용량을 그래프로 표시 |
| 전체 Token 수 | 조회 기간 동안 전체 Token 사용량을 Input 및 Output으로 구분하여 표시 |
| Request 당 평균 Token 수 | 조회 기간 동안 LLM 호출 시 사용한 평균 Token량을 Input 및 Output으로 구분하여 표시 |
태그
Serverless Inference 목록 페이지에서 선택한 자원의 태그 정보를 확인하고, 추가하거나 변경 또는 삭제할 수 있습니다.
| 구분 | 상세 설명 |
|---|---|
| 태그 목록 | 태그 목록
|
작업 이력
Serverless Inference 목록 페이지에서 선택한 자원의 작업 이력을 확인할 수 있습니다.
| 구분 | 상세 설명 |
|---|---|
| 작업 이력 목록 | 자원 변경 이력
|
모델 상세 정보 확인하기
Simple AI Inference에서 제공하는 모델과 모델의 상세 정보를 확인할 수 있습니다.
모델 상세 정보를 확인하려면 다음 절차를 따르세요.
- 모든 서비스 > AI-ML > Simple AI Inference 메뉴를 클릭하세요. Simple AI Inference의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 모델 카탈로그 메뉴를 클릭하세요. 모델 카탈로그 페이지로 이동합니다.
- 모델 카탈로그 페이지에서 상세 정보를 확인할 모델을 클릭하세요. 모델 카탈로그 상세 페이지로 이동합니다.
항목 설명 라이선스 버튼을 클릭하여 모델의 라이선스 내용 확인 가능 개요 모델에 대한 기본 설명 판매 기준 모델 개발사 범주 모델 활용 범위 마지막 버전 제공 버전 출시 날짜 모델 출시년도 및 일자 모델 ID 모델 ID 정보 최대 토큰 토큰 최대 크기 Output modelities 모델 출력 방식 Input modelities 모델 입력 방식 언어 모델 언어 종류 배포 유형 모델 배포 방식 Token Limits 토큰 제한값 Reqeust Limits 요청 제한값 표. Simple AI Inference 제공 모델 상세 정보
API 키 관리하기
Simple AI Inference를 Severless Inference에서 이용할 API Key를 생성하고 등록해야 합니다.
API 키 생성하기
API 키를 생성하려면 다음 절차를 따르세요.
모든 서비스 > AI-ML > Simple AI Inference 메뉴를 클릭하세요. Simple AI Inference의 Service Home 페이지로 이동합니다.
Service Home 페이지에서 API 키 메뉴를 클릭하세요. API 키 목록 페이지로 이동합니다.
API 키 목록 페이지에서 키 생성 버튼을 모델을 클릭하세요. API Key 생성 상세 페이지로 이동합니다.
API 키 생성 페이지에서 API 키를 생성하기 위한 정보를 입력한 후, 생성 버튼을 클릭하세요.
구분 필수 여부상세 설명 Inference 유형 필수 Inference 유형을 선택 만료 기간 필수 API 키의 만료 기간을 입력 - 영구 항목을 체크하면 기간 제한 없이 사용 가능
사용 용도 선택 API 키의 사용 용도를 128자 이내로 입력 표. Serverless Inference 서비스 정보 입력 항목주의퍼블릭 엔드 포인트 접근 제어를 사용하지 않거나 전체 IP 범위(Any, 0.0.0.0/0)로 설정할 경우, 레지스트리가 외부 스캔 및 해킹 등의 보안 공격에 노출될 수 있습니다.API 키 생성을 알리는 팝업창이 열리면 확인 버튼을 클릭하세요.
- API 키 생성 시 생성 시점에 최초 1회 다운로드됩니다.
API 키 확인하기
API 키를 확인하려면 다음 절차를 따르세요.
- 모든 서비스 > AI-ML > Simple AI Inference 메뉴를 클릭하세요. Simple AI Inference의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 API 키 메뉴를 클릭하세요. API 키 목록 페이지로 이동합니다.
항목 설명 인증키 인증키 정보 Inference 유형 인증키를 등록한 Inference 유형 생성 일시 인증키 생성 일시 만료 일시 인증키 만료 일시 삭제 선택한 API 키를 삭제 - API 키는 비활성화 상태에서만 삭제 가능
- 삭제된 API 키는 복구 불가
- API 키를 삭제하는 방법은 API 키 삭제하기 참고
더보기 선택한 API 키의 활성화/비활성화 상태 변경 - 사용: 비활성화된 인증키를 활성화
- 사용 중지: 활성화된 인증키를 비활성화
- API 키 상태를 변경하는 방법은 API 키 상태 변경하기 참고
키 생성 API 키를 생성 - 버튼 클릭 시 API 키 생성 페이지로 이동
- API 키를 생성하는 방법은 API 키 생성하기 참고
표. Simple AI Inference 제공 모델 상세 정보
- API 키는 생성 시 활성화 상태로 생성됩니다.
- API 키 노출이 의심되는 경우에는 사용 중지를 통해 API 키를 비활성화하여 API 호출을 즉시 차단하세요. 이후, API 키의 안정성이 확인되면 사용으로 키를 다시 활성화하여 사용할 수 있습니다.
API 키 상태 변경하기
API 키의 상태를 활성화 또는 비활성화할 수 있습니다.
API 키의 상태를 변경하려면 다음 절차를 따르세요.
- 모든 서비스 > AI-ML > Simple AI Inference 메뉴를 클릭하세요. Simple AI Inference의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 API 키 메뉴를 클릭하세요. API 키 목록 페이지로 이동합니다.
- API 키 목록 페이지에서 상태를 변경할 API 키를 모두 선택하세요.
- 목록 상단의 더보기 버튼을 클릭한 후, 사용 또는 사용 중지 버튼을 클릭하세요.
- API 키가 사용 상태인 경우: 사용 버튼을 클릭하여 활성화 가능
- API 키가 사용 중지 상태인 경우: 사용 중지 버튼을 클릭하여 비활성화 가능
- 상태 변경을 알리는 팝업창이 열리면 확인 버튼을 클릭하세요.
API 키 삭제하기
API 키를 삭제하려면 다음 절차를 따르세요.
- API 키는 비활성화 상태에서만 삭제할 수 있습니다.
- 삭제된 API 키는 복구할 수 없으며, 해당 키를 이용한 API 호출은 영구적으로 사용할 수 없습니다.
- API 키를 다시 사용하려면 새로운 API 키를 생성해야 합니다.
- 모든 서비스 > AI-ML > Simple AI Inference 메뉴를 클릭하세요. Simple AI Inference의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 API 키 메뉴를 클릭하세요. API 키 목록 페이지로 이동합니다.
- API 키 목록 페이지에서 삭제할 API 키가 비활성화 상태인지 확인하세요.
- API 키가 활성화 상태일 경우, API 키 상태 변경하기를 참고하여 비활성화 상태로 변경하세요.
- API 키 목록 페이지에서 삭제할 API 키를 모두 선택한 후, 삭제 버튼을 클릭하세요.
- 삭제를 알리는 팝업창이 열리면 확인 버튼을 클릭하세요.
Inference 해지하기
Serverless Inference 해지하기
Serverless Inference를 해지하려면 다음 절차를 따르세요.
- 모든 서비스 > AI-ML > Simple AI Inference 메뉴를 클릭하세요. Simple AI Inference의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Serverless Inference 메뉴를 클릭하세요. Serverless Inference 목록 페이지로 이동합니다.
- Serverless Inference 목록 페이지에서 삭제할 Serverless Inference의서비스 해지 버튼을 클릭하세요.
- 서비스 해지를 알리는 팝업창이 열리면 서비스명을 입력한 후, 확인 버튼을 클릭하세요.
1.3 - References
References
Simple AI Inference에서 지원하는 API Reference를 확인할 수 있습니다.
| 구분 | 설명 |
|---|---|
| API Reference | Simple AI Inference에서 지원하는 API 목록
|
1.3.1 - API Reference
API Reference 개요
Simple AI Inference에서 지원하는 API Reference는 다음과 같습니다.
| API명 | API | 상세 설명 |
|---|---|---|
| Chat Completions API | POST /v1/chat/completions | OpenAI의 Completions API와 호환되며 OpenAI Python client에서 사용할 수 있습니다. |
| Completions API | POST /v1/completions | OpenAI의 Completions API와 호환되며 OpenAI Python client에서 사용할 수 있습니다. |
| Embedding API | POST /v1/embeddings | 텍스트를 고차원 벡터(임베딩)로 변환하여, 텍스트 간 유사도 계산, 클러스터링, 검색 등 다양한 자연어 처리(NLP) 작업에 활용할 수 있습니다. |
| Rerank API | POST /v2/rerank | 임베딩 모델이나 크로스 인코더 모델을 적용하여 단일 쿼리와 문서 목록의 각 항목 간 관련성을 예측합니다. |
| Responses API | POST /v1/responses | OpenAI의 Responses API와 호환되며 텍스트, 이미지, 파일 입력으로 텍스트 또는 JSON 출력을 생성할 수 있으며, 함수 호출 및 빌트인 도구를 지원합니다. |
| Tokenize API | POST /tokenize | 텍스트를 토큰 ID로 변환합니다. Completion 방식과 Chat 방식을 지원합니다. |
| Models API | GET /v1/models | 배포된 모델의 목록을 반환합니다. OpenAI의 Models API와 호환됩니다. |
Chat Completions API
POST /v1/chat/completions
개요
Chat Completions API는 OpenAI의 Completions API와 호환되며 OpenAI Python client에서 사용할 수 있습니다.
Request
Context
| Key | Type | Description | Example |
|---|---|---|---|
| Base URL | string | API 요청을 위한 Simple AI Inference URL | Simple AI Inference 엔드포인트 |
| Request Method | string | API 요청에 사용되는 HTTP 메서드 | POST |
| Headers | object | 요청 시 필요한 헤더 정보 | { “Content-Type”: “application/json”, “Authorization”: “bearer sai-xxxxxxx…” } |
| Body Parameters | object | 요청 본문에 포함되는 파라미터 | {“model”: “google/gemma-4-31B-it”, “messages”: [{“role”: “user”, “content”: “hello”}], “stream”: true } |
Path Parameters
| Name | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|
| None |
Query Parameters
| Name | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|
| None |
Body Parameters
| Name | Name Sub | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|---|
| model | - | string | ✅ | 응답 생성에 사용할 모델을 지정 | “google/gemma-4-31B-it” | ||
| messages | role | string | ✅ | 대화 내역을 포함하는 메시지 리스트 | [ { “role” : “user” , “content” : “message” }] | ||
| frequency_penalty | - | number | ❌ | 반복되는 토큰에 대한 패널티를 조정 | 0 | -2.0 ~ 2.0 | 0.5 |
| logit_bias | - | object | ❌ | 특정 토큰의 확률을 조정(예시: { “100”: 2.0 }) | null | Key: 토큰 ID, Value: -100 ~ 100 | { “100”: 2.0 } |
| logprobs | - | boolean | ❌ | 상위 logprobs 개수의 토큰 확률을 반환 | false | true, false | true |
| max_completion_tokens | - | integer | ❌ | 최대 생성 토큰 수를 제한 | None | 0 ~ 모델 최대값 | 100 |
| max_tokens (Deprecated) | - | integer | ❌ | 최대 생성 토큰 수를 제한 | None | 0 ~ 모델 최대값 | 100 |
| n | - | integer | ❌ | 생성할 응답 개수를 지정 | 1 | 3 | |
| presence_penalty | - | number | ❌ | 기존 텍스트에 포함된 토큰에 대한 패널티를 조정 | 0 | -2.0 ~ 2.0 | 1.0 |
| seed | - | integer | ❌ | 랜덤성 제어를 위한 시드 값을 지정 | None | ||
| stop | - | string / array / null | ❌ | 특정 문자열이 나타나면 생성을 중단 | null | "\n" | |
| stream | - | boolean | ❌ | 스트리밍 방식으로 결과를 반환할지 여부 | false | true/false | true |
| stream_options | include_usage, continuous_usage_stats | object | ❌ | 스트리밍 옵션을 제어(예시: 사용량 통계 포함 여부) | null | { “include_usage”: true } | |
| temperature | - | number | ❌ | 생성 결과의 창의성을 조절(높을수록 무작위) | 1 | 0.0 ~ 1.0 | 0.7 |
| tool_choice | - | string | ❌ | 어떤 Tool이 모델에 의해 호출될지 조정
|
| ||
| tools | - | array | ❌ | 모델이 호출할 수 있는 Tool의 리스트
| None | ||
| top_logprobs | - | integer | ❌ | 0과 20사이의 정수 가장 확률이 높은 토큰의 수를 지정
| None | 0 ~ 20 | 3 |
| top_p | - | number | ❌ | 토큰의 샘플링 확률을 제한(높을수록 더 많은 토큰 고려) | 1 | 0.0 ~ 1.0 | 0.9 |
| prompt_safety_model | - | string | ❌ | Prompt 검사를 위한 guard 모델 지정. 설정 시 guard 모델로 prompt를 먼저 검사하며, unsafe로 판단되면 guard 결과를 반환하고 safe이면 model 파라미터에 지정된 모델로 요청을 처리 | “meta-llama/Llama-Guard-4-12B” | ||
| chat_template_kwargs | - | object | ❌ | 템플릿 렌더러에 전달할 추가 키워드 인자. 모델별 reasoning 설정을 위해 사용(자세한 내용은 Reasoning 설정 참고) | null | { “enable_thinking”: true } |
Example
curl -X 'POST' \
{Simple AI Inference 엔드포인트}/v1/chat/completions \
-H 'Authorization: bearer sai-xxxxxxx...' \
-H 'Content-Type: application/json' \
-d '{
"model": "google/gemma-4-31B-it",
"messages": [
{
"role": "assistant",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "한국의 수도는 어디입니까?"
}
]
}'curl -X 'POST' \
{Simple AI Inference 엔드포인트}/v1/chat/completions \
-H 'Authorization: bearer sai-xxxxxxx...' \
-H 'Content-Type: application/json' \
-d '{
"model": "google/gemma-4-31B-it",
"messages": [
{
"role": "assistant",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "한국의 수도는 어디입니까?"
}
]
}'Response
200 OK
| Name | Type | Description |
|---|---|---|
| id | string | 응답의 고유 식별자 |
| object | string | 응답 객체의 타입(예시: “chat.completion”) |
| created | integer | 생성 시각(Unix timestamp, 초 단위) |
| model | string | 사용된 모델의 이름 |
| choices | array | 생성된 응답 선택지 목록 |
| choices[].index | integer | 해당 choice의 인덱스 |
| choices[].message | object | 생성된 메시지 객체 |
| choices[].message.role | string | 메시지 작성자의 역할(예시: “assistant”) |
| choices[].message.content | string | 생성된 메시지의 실제 내용 |
| choices[].message.reasoning | string | 생성된 추론 메시지의 실제 내용 |
| choices[].message.tool_calls | array (optional) | 도구 호출 정보(모델/설정에 따라 포함될 수 있음) |
| choices[].finish_reason | string or null | 응답이 종료된 이유(예시: “stop”, “length” 등) |
| choices[].stop_reason | object or null | 추가 중단 이유 세부 정보 |
| choices[].logprobs | object or null | 토큰 별 로그 확률 정보(설정에 따라 포함) |
| usage | object | 토큰 사용량 통계 |
| usage.prompt_tokens | integer | 입력 프롬프트에 사용된 토큰 수 |
| usage.completion_tokens | integer | 생성된 응답에 사용된 토큰 수 |
| usage.total_tokens | integer | 전체 토큰 수(입력 + 출력) |
Error Code
| HTTP status code | ErrorCode 설명 |
|---|---|
| 400 | Bad Request |
| 422 | Prompt Guard 등 정책에 의해 요청이 거절된 경우 |
| 500 | Internal Server Error |
Example
{
"id": "chatcmpl-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"object": "chat.completion",
"created": 1749702816,
"model": "google/gemma-4-31B-it",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"reasoning": null,
"content": "한국의 수도는 서울입니다.",
"tool_calls": []
},
"logprobs": null,
"finish_reason": "stop",
"stop_reason": null
}
],
"usage": {
"prompt_tokens": 54,
"total_tokens": 62,
"completion_tokens": 8,
"prompt_tokens_details": null
},
"prompt_logprobs": null
}{
"id": "chatcmpl-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"object": "chat.completion",
"created": 1749702816,
"model": "google/gemma-4-31B-it",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"reasoning": null,
"content": "한국의 수도는 서울입니다.",
"tool_calls": []
},
"logprobs": null,
"finish_reason": "stop",
"stop_reason": null
}
],
"usage": {
"prompt_tokens": 54,
"total_tokens": 62,
"completion_tokens": 8,
"prompt_tokens_details": null
},
"prompt_logprobs": null
}Prompt Guard 응답
prompt_safety_model 파라미터를 설정한 경우, guard 모델이 prompt를 먼저 검사합니다.
- safe:
model파라미터에 지정된 모델로 요청이 그대로 처리됩니다. - unsafe: 아래와 같은 형태의 guard 결과를 반환하며 요청이 중단됩니다.
{
"guard_result": "unsafe",
"categories": ["S1", "S2"],
"categories_description": ["Violent Crimes", "Non-Violent Crimes"],
"messages": [
"Cannot fulfill the request due to violent content.",
"Cannot respond as it may promote illegal activities."
]
}{
"guard_result": "unsafe",
"categories": ["S1", "S2"],
"categories_description": ["Violent Crimes", "Non-Violent Crimes"],
"messages": [
"Cannot fulfill the request due to violent content.",
"Cannot respond as it may promote illegal activities."
]
}Reasoning 설정
chat_template_kwargs 파라미터를 통해 모델별 reasoning(추론 모드) 설정을 제어할 수 있습니다. 모델마다 기본 동작과 지원하는 옵션이 다릅니다.
| 모델 | 기본 reasoning | chat_template_kwargs 설정 | 설명 |
|---|---|---|---|
| zai-org/GLM-5.2 | 켜짐 (Think Max) |
| reasoning_effort로 추론 깊이 조절, enable_thinking=false로 비활성화 |
| Qwen/Qwen3.6-27B | 켜짐 |
| 기본적으로 reasoning이 활성화되어 있으며, 필요시 비활성화 가능 |
| google/gemma-4-31B-it | 꺼짐 |
| 기본적으로 reasoning이 비활성화되어 있으며, 필요시 활성화 가능 |
| openai/gpt-oss-120b | medium |
| reasoning_effort로 추론 깊이 조절 (기본값: medium) |
curl -X 'POST' \
{Simple AI Inference 엔드포인트}/v1/chat/completions \
-H 'Authorization: bearer sai-xxxxxxx...' \
-H 'Content-Type: application/json' \
-d '{
"model": "zai-org/GLM-5.2",
"messages": [
{
"role": "user",
"content": "복잡한 수학 문제를 풀어주세요."
}
],
"chat_template_kwargs": {
"reasoning_effort": "high"
}
}'curl -X 'POST' \
{Simple AI Inference 엔드포인트}/v1/chat/completions \
-H 'Authorization: bearer sai-xxxxxxx...' \
-H 'Content-Type: application/json' \
-d '{
"model": "zai-org/GLM-5.2",
"messages": [
{
"role": "user",
"content": "복잡한 수학 문제를 풀어주세요."
}
],
"chat_template_kwargs": {
"reasoning_effort": "high"
}
}'참고
Completions API
POST /v1/completions
개요
Completions API는 OpenAI의 Completions API와 호환되며 OpenAI Python client에서 사용할 수 있습니다.
Request
Context
| Key | Type | Description | Example |
|---|---|---|---|
| Base URL | string | API 요청을 위한 Simple AI Inference URL | Simple AI Inference 엔드포인트 |
| Request Method | string | API 요청에 사용되는 HTTP 메서드 | POST |
| Headers | object | 요청 시 필요한 헤더 정보 | { “Content-Type”: “application/json”, “Authorization”: “bearer sai-xxxxxxx…” } |
| Body Parameters | object | 요청 본문에 포함되는 파라미터 | {“model”: “google/gemma-4-31B-it”, “prompt” : “hello”, “stream”: true } |
Path Parameters
| Name | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|
| None |
Query Parameters
| Name | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|
| None |
Body Parameters
| Name | Name Sub | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|---|
| model | - | string | ✅ | 응답 생성에 사용할 모델을 지정 | “google/gemma-4-31B-it” | ||
| prompt | - | array | ✅ | 사용자 입력 텍스트 | "" | ||
| echo | - | boolean | ❌ | 입력 텍스트를 출력에 포함시킬지 여부 | false | true/false | true |
| frequency_penalty | - | number | ❌ | 반복되는 토큰에 대한 패널티를 조정 | 0 | -2.0 ~ 2.0 | 0.5 |
| logit_bias | - | object | ❌ | 특정 토큰의 확률을 조정 (예시: { “100”: 2.0 }) | null | Key: 토큰 ID, Value: -100~100 | { “100”: 2.0 } |
| logprobs | - | integer | ❌ | 상위 logprobs 개수의 토큰 확률을 반환 | null | 1 ~ 5 | 5 |
| max_completion_tokens | - | integer | ❌ | 최대 생성 토큰 수를 제한 | None | 0~모델 최대 값 | 100 |
| max_tokens (Deprecated) | - | integer | ❌ | 최대 생성 토큰 수를 제한 | None | 0~모델 최대 값 | 100 |
| n | - | integer | ❌ | 생성할 응답 개수를 지정 | 1 | 3 | |
| presence_penalty | - | number | ❌ | 기존 텍스트에 포함된 토큰에 대한 패널티를 조정 | 0 | -2.0 ~ 2.0 | 1.0 |
| seed | - | integer | ❌ | 랜덤성 제어를 위한 시드값을 지정 | None | ||
| stop | - | string / array / null | ❌ | 특정 문자열이 나타나면 생성을 중단 | null | "\n" | |
| stream | - | boolean | ❌ | 스트리밍 방식으로 결과를 반환할지 여부 | false | true/false | true |
| stream_options | include_usage, continuous_usage_stats | object | ❌ | 스트리밍 옵션을 제어 (예시: 사용량 통계 포함 여부) | null | { “include_usage”: true } | |
| temperature | - | number | ❌ | 생성 결과의 창의성을 조절 (높을수록 무작위) | 1 | 0.0 ~ 1.0 | 0.7 |
| top_p | - | number | ❌ | 토큰의 샘플링 확률을 제한 (높을수록 더 많은 토큰 고려) | 1 | 0.0 ~ 1.0 | 0.9 |
Example
curl -X 'POST' \
{Simple AI Inference 엔드포인트}/v1/completions \
-H 'Authorization: bearer sai-xxxxxxx...' \
-H 'Content-Type: application/json' \
-d '{
"model": "google/gemma-4-31B-it",
"prompt": "한국의 수도는 어디입니까?",
"temperature": 0.7
}'curl -X 'POST' \
{Simple AI Inference 엔드포인트}/v1/completions \
-H 'Authorization: bearer sai-xxxxxxx...' \
-H 'Content-Type: application/json' \
-d '{
"model": "google/gemma-4-31B-it",
"prompt": "한국의 수도는 어디입니까?",
"temperature": 0.7
}'Response
200 OK
| Name | Type | Description |
|---|---|---|
| id | string | 응답의 고유 식별자 |
| object | string | 응답 객체의 타입(예시: “text_completion”) |
| created | integer | 생성 시각(Unix timestamp, 초 단위) |
| model | string | 사용된 모델의 이름 |
| choices | array | 생성된 응답 선택지 목록 |
| choices[].index | number | 해당 choice의 인덱스 |
| choices[].text | string | 생성된 텍스트 객체 |
| choices[].logprobs | object | 토큰 별 로그 확률 정보(설정에 따라 포함) |
| choices[].finish_reason | string or null | 응답이 종료된 이유(예시: “stop”, “length” 등) |
| choices[].stop_reason | object or null | 추가 중단 이유 세부 정보 |
| choices[].prompt_logprobs | object or null | 입력 프롬프트 토큰별 로그 확률(널 가능) |
| usage | object | 토큰 사용량 통계 |
| usage.prompt_tokens | number | 입력 프롬프트에 사용된 토큰 수 |
| usage.total_tokens | number | 전체 토큰 수(입력 + 출력) |
| usage.completion_tokens | number | 생성된 응답에 사용된 토큰 수 |
| usage.prompt_tokens_details | object | 프롬프트 토큰 사용 세부 정보 |
Error Code
| HTTP status code | ErrorCode 설명 |
|---|---|
| 400 | Bad Request |
| 422 | Prompt Guard 등 정책에 의해 요청이 거절된 경우 |
| 500 | Internal Server Error |
Example
{
"id": "cmpl-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"object": "text_completion",
"created": 1749702612,
"model": "google/gemma-4-31B-it",
"choices": [
{
"index": 0,
"text": " \nOur capital city is Seoul. \n\nA. 1\nB. ",
"logprobs": null,
"finish_reason": "length",
"stop_reason": null,
"prompt_logprobs": null
}
],
"usage": {
"prompt_tokens": 9,
"total_tokens": 25,
"completion_tokens": 16,
"prompt_tokens_details": null
}
}{
"id": "cmpl-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"object": "text_completion",
"created": 1749702612,
"model": "google/gemma-4-31B-it",
"choices": [
{
"index": 0,
"text": " \nOur capital city is Seoul. \n\nA. 1\nB. ",
"logprobs": null,
"finish_reason": "length",
"stop_reason": null,
"prompt_logprobs": null
}
],
"usage": {
"prompt_tokens": 9,
"total_tokens": 25,
"completion_tokens": 16,
"prompt_tokens_details": null
}
}참고
Embedding API
POST /v1/embeddings
개요
Embedding API는 주어진 텍스트를 고차원 벡터(임베딩)로 변환하여, 텍스트 간 유사도 계산, 클러스터링, 검색 등 다양한 자연어 처리(NLP) 작업에 활용할 수 있도록 지원합니다.
Request
Context
| Key | Type | Description | Example |
|---|---|---|---|
| Base URL | string | API 요청을 위한 Simple AI Inference URL | Simple AI Inference 엔드포인트 |
| Request Method | string | API 요청에 사용되는 HTTP 메서드 | POST |
| Headers | object | 요청 시 필요한 헤더 정보 | { “Content-Type”: “application/json”, “Authorization”: “bearer sai-xxxxxxx…” } |
| Body Parameters | object | 요청 본문에 포함되는 파라미터 | { “model”: “Qwen/Qwen3-VL-Embedding-8B”, “input”: “What is the capital of France?”} |
Path Parameters
| Name | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|
| None |
Query Parameters
| Name | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|
| None |
Body Parameters
| Name | Name Sub | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|---|
| model | - | string | ✅ | 응답 생성에 사용할 모델을 지정 | “Qwen/Qwen3-VL-Embedding-8B” | ||
| input | - | array | ✅ | 사용자의 검색 질의 또는 질문 | “What is the capital of France?" | ||
| encoding_format | - | string | ❌ | 임베딩을 반환할 형식을 지정 | “float” | “float”, “base64” | [0.01319122314453125,0.057220458984375, … (생략) |
| truncate_prompt_tokens | - | integer | ❌ | 입력 토큰 수를 제한 | > 0 | 100 |
Example
curl -X 'POST' \
{Simple AI Inference 엔드포인트}/v1/embeddings \
-H 'Authorization: bearer sai-xxxxxxx...' \
-H 'Content-Type: application/json' \
-d '{
"model": "Qwen/Qwen3-VL-Embedding-8B",
"input": "What is the capital of France?",
"encoding_format": "float"
}'curl -X 'POST' \
{Simple AI Inference 엔드포인트}/v1/embeddings \
-H 'Authorization: bearer sai-xxxxxxx...' \
-H 'Content-Type: application/json' \
-d '{
"model": "Qwen/Qwen3-VL-Embedding-8B",
"input": "What is the capital of France?",
"encoding_format": "float"
}'Response
200 OK
| Name | Type | Description |
|---|---|---|
| id | string | 응답의 고유 식별자 |
| object | string | 응답 객체의 타입(예시: “list” ) |
| created | number | 생성 시각(Unix timestamp, 초 단위) |
| model | string | 사용된 모델의 이름 |
| data | array | 임베딩 결과를 담은 객체 배열 |
| data.index | number | 입력 텍스트의 순서 인덱스 (예시: 입력 텍스트가 여러 개일 경우 순서를 나타냄) |
| data.object | string | 데이터 항목 타입 |
| data.embedding | array | 입력 텍스트의 임베딩 벡터 값 (모델의 임베딩 차원에 따른 float 배열로 구성) |
| usage | object | 토큰 사용량 통계 |
| usage.prompt_tokens | number | 입력 프롬프트에 사용된 토큰 수 |
| usage.total_tokens | number | 전체 토큰 수(입력 + 출력) |
| usage.completion_tokens | number | 생성된 응답에 사용된 토큰 수 |
| usage.prompt_tokens_details | object | 프롬프트 토큰의 세부 정보 |
Error Code
| HTTP status code | ErrorCode 설명 |
|---|---|
| 400 | Bad Request |
| 422 | Prompt Guard 등 정책에 의해 요청이 거절된 경우 |
| 500 | Internal Server Error |
Example
{
"id":"embd-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"object":"list",
"created":1749035024,
"model":"Qwen/Qwen3-VL-Embedding-8B",
"data":[
{
"index":0,
"object":"embedding",
"embedding":
[0.01319122314453125,0.057220458984375,-0.028533935546875,-0.0008697509765625,-0.01422119140625,0.033416748046875,-0.0062408447265625,-0.04364013671875,-0.004497528076171875,0.0008072853088378906,-0.0193328857421875,0.041168212890625,-0.019317626953125,-0.0188751220703125,-0.047088623046875,
-0 ....(생략)
-0.05706787109375,-0.0147705078125]
}
],
"usage":
{
"prompt_tokens":9,
"total_tokens":9,
"completion_tokens":0,
"prompt_tokens_details":null
}
}{
"id":"embd-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"object":"list",
"created":1749035024,
"model":"Qwen/Qwen3-VL-Embedding-8B",
"data":[
{
"index":0,
"object":"embedding",
"embedding":
[0.01319122314453125,0.057220458984375,-0.028533935546875,-0.0008697509765625,-0.01422119140625,0.033416748046875,-0.0062408447265625,-0.04364013671875,-0.004497528076171875,0.0008072853088378906,-0.0193328857421875,0.041168212890625,-0.019317626953125,-0.0188751220703125,-0.047088623046875,
-0 ....(생략)
-0.05706787109375,-0.0147705078125]
}
],
"usage":
{
"prompt_tokens":9,
"total_tokens":9,
"completion_tokens":0,
"prompt_tokens_details":null
}
}참고
Rerank API
POST /v2/rerank
개요
Rerank API는 임베딩 모델이나 크로스 인코더 모델을 적용하여 단일 쿼리와 문서 목록의 각 항목 간 관련성을 예측할 수 있습니다. 일반적으로 문장 쌍의 점수는 두 문장 간 유사도를 0에서 1 사이의 범위로 나타냅니다.
- Embedding 기반 모델: Query와 문서를 각각 벡터로 바꾼 뒤, 벡터간의 유사도(예시: 코사인 유사도)를 측정하여 점수를 계산합니다.
- Reranker(Cross-Encoder) 기반 모델: Query와 문서를 한쌍으로 모델에 넣어서 평가합니다.
Request
Context
| Key | Type | Description | Example |
|---|---|---|---|
| Base URL | string | API 요청을 위한 Simple AI Inference URL | Simple AI Inference 엔드포인트 |
| Request Method | string | API 요청에 사용되는 HTTP 메서드 | POST |
| Headers | object | 요청 시 필요한 헤더 정보 | { “Content-Type”: “application/json”, “Authorization”: “bearer sai-xxxxxxx…” } |
| Body Parameters | object | 요청 본문에 포함되는 파라미터 | { “model”: “Qwen/Qwen3-VL-Reranker-8B”, “query”: …, “documents”: […] } |
Path Parameters
| Name | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|
| None |
Query Parameters
| Name | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|
| None |
Body Parameters
| Name | Name Sub | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|---|
| model | - | string | ✅ | 응답 생성에 사용할 모델을 지정 | “Qwen/Qwen3-VL-Reranker-8B” | ||
| query | - | string | ✅ | 사용자의 검색 질의 또는 질문 | “What is the capital of France?" | ||
| documents | - | array | ✅ | 재정렬 대상인 문서 목록 | 최대 모델 입력 길이 제한 | [“The capital of France is Paris.”] | |
| top_n | - | integer | ❌ | 반환할 상위 문서 개수를 지정(0이면 전체 반환) | 0 | > 0 | 5 |
| truncate_prompt_tokens | - | integer | ❌ | 입력 토큰 수를 제한 | > 0 | 100 |
Example
curl -X 'POST' \
{Simple AI Inference 엔드포인트}/v2/rerank \
-H 'Authorization: bearer sai-xxxxxxx...' \
-H 'Content-Type: application/json' \
-d '{
"model": "Qwen/Qwen3-VL-Reranker-8B",
"query": "What is the capital of France?",
"documents": [
"The capital of France is Paris.",
"France capital city is known for the Eiffel Tower.",
"Paris is located in the north-central part of France."
],
"top_n": 2,
"truncate_prompt_tokens": 512
}'curl -X 'POST' \
{Simple AI Inference 엔드포인트}/v2/rerank \
-H 'Authorization: bearer sai-xxxxxxx...' \
-H 'Content-Type: application/json' \
-d '{
"model": "Qwen/Qwen3-VL-Reranker-8B",
"query": "What is the capital of France?",
"documents": [
"The capital of France is Paris.",
"France capital city is known for the Eiffel Tower.",
"Paris is located in the north-central part of France."
],
"top_n": 2,
"truncate_prompt_tokens": 512
}'Response
200 OK
| Name | Type | Description |
|---|---|---|
| id | string | API 응답의 고유 식별자(UUID 형식) |
| model | string | 결과를 생성한 모델의 이름 |
| usage | object | 요청에 사용된 리소스 정보를 담은 객체 |
| usage.prompt_tokens | integer | 입력 프롬프트에 사용된 토큰 수 |
| usage.total_tokens | integer | 요청 처리에 사용된 총 토큰 수 |
| results | array | 쿼리와 관련된 문서들의 결과를 담은 배열 |
| results[].index | integer | 결과 배열 내의 순서 번호 |
| results[].document | object | 검색된 문서의 내용을 담은 객체 |
| results[].document.text | string | 검색된 문서의 실제 텍스트 내용 |
| results[].document.multi_modal | object or null | 멀티모달 문서 정보 |
| results[].relevance_score | float | 쿼리와 문서 간의 관련성을 나타내는 점수(0 ~ 1) |
Error Code
| HTTP status code | ErrorCode 설명 |
|---|---|
| 400 | Bad Request |
| 422 | Prompt Guard 등 정책에 의해 요청이 거절된 경우 |
| 500 | Internal Server Error |
Example
{
"id": "score-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"model": "Qwen/Qwen3-VL-Reranker-8B",
"usage": {
"prompt_tokens": 54,
"total_tokens": 54
},
"results": [
{
"index": 0,
"document": {
"text": "The capital of France is Paris.",
"multi_modal": null
},
"relevance_score": 0.9237253665924072
},
{
"index": 2,
"document": {
"text": "Paris is located in the north-central part of France.",
"multi_modal": null
},
"relevance_score": 0.9181006550788879
}
]
}{
"id": "score-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"model": "Qwen/Qwen3-VL-Reranker-8B",
"usage": {
"prompt_tokens": 54,
"total_tokens": 54
},
"results": [
{
"index": 0,
"document": {
"text": "The capital of France is Paris.",
"multi_modal": null
},
"relevance_score": 0.9237253665924072
},
{
"index": 2,
"document": {
"text": "Paris is located in the north-central part of France.",
"multi_modal": null
},
"relevance_score": 0.9181006550788879
}
]
}참고
Responses API
POST /v1/responses
개요
Responses API는 OpenAI의 Responses API와 호환되며 OpenAI Python client에서 사용할 수 있습니다. 텍스트, 이미지, 파일 입력으로 텍스트 또는 JSON 출력을 생성할 수 있으며, 함수 호출 및 빌트인 도구(web search, file search 등)를 지원합니다.
Request
Context
| Key | Type | Description | Example |
|---|---|---|---|
| Base URL | string | API 요청을 위한 Simple AI Inference URL | Simple AI Inference 엔드포인트 |
| Request Method | string | API 요청에 사용되는 HTTP 메서드 | POST |
| Headers | object | 요청 시 필요한 헤더 정보 | { “Content-Type”: “application/json”, “Authorization”: “bearer sai-xxxxxxx…” } |
| Body Parameters | object | 요청 본문에 포함되는 파라미터 | {“model”: “openai/gpt-oss-120b”, “input”: “한국의 수도는 어디입니까?” } |
Path Parameters
| Name | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|
| None |
Query Parameters
| Name | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|
| None |
Body Parameters
| Name | Name Sub | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|---|
| model | - | string | ✅ | 응답 생성에 사용할 모델 ID | “openai/gpt-oss-120b” | ||
| input | - | string / array | ✅ | 모델에 대한 텍스트/이미지/파일 입력. 문자열 또는 InputItem 배열 | “Tell me a story” 또는 [{ “role” : “user”, “content” : “message” }] | ||
| instructions | - | string | ❌ | 모델 컨텍스트에 삽입되는 시스템(개발자) 메시지 | null | “You are a helpful assistant." | |
| temperature | - | number | ❌ | 샘플링 온도. 높을수록 무작위, 낮을수록 결정적 | 1 | 0 ~ 2 | 0.7 |
| top_p | - | number | ❌ | nucleus 샘플링 확률 제한. temperature와 함께 변경 권장하지 않음 | 1 | 0 ~ 1 | 0.9 |
| top_logprobs | - | integer | ❌ | 각 토큰 위치에서 반환할 최대 로그 확률 토큰 수 | null | 0 ~ 20 | 3 |
| stream | - | boolean | ❌ | 스트리밍 방식으로 결과를 반환할지 여부 | false | true/false | true |
| stream_options | include_usage | object | ❌ | 스트리밍 옵션을 제어(예시: 사용량 통계 포함 여부) | null | { “include_usage”: true } | |
| tools | - | array | ❌ | 모델이 호출할 수 있는 도구 목록(빌트인 도구 + function)
| [] | ||
| tool_choice | - | string / object | ❌ | 모델이 도구를 선택하는 방식
|
| ||
| prompt_safety_model | - | string | ❌ | Prompt 검사를 위한 guard 모델 지정. 설정 시 guard 모델로 prompt를 먼저 검사하며, unsafe로 판단되면 guard 결과를 반환하고 safe이면 model 파라미터에 지정된 모델로 요청을 처리 | “meta-llama/Llama-Guard-4-12B” | ||
| chat_template_kwargs | - | object | ❌ | 템플릿 렌더러에 전달할 추가 키워드 인자. 모델별 reasoning 설정을 위해 사용(gpt-oss-120b는 reasoning 파라미터 사용, 자세한 내용은 Reasoning 설정 참고) | null | { “enable_thinking”: true } | |
| reasoning | - | object | ❌ | gpt-oss-120b 모델의 reasoning 설정. effort 필드로 추론 깊이 지정(low/medium/high, 기본값 medium) | null | { “effort”: “high” } |
Example
curl -X 'POST' \
{Simple AI Inference 엔드포인트}/v1/responses \
-H 'Authorization: bearer sai-xxxxxxx...' \
-H 'Content-Type: application/json' \
-d '{
"model": "openai/gpt-oss-120b",
"input": "한국의 수도는 어디입니까?"
}'curl -X 'POST' \
{Simple AI Inference 엔드포인트}/v1/responses \
-H 'Authorization: bearer sai-xxxxxxx...' \
-H 'Content-Type: application/json' \
-d '{
"model": "openai/gpt-oss-120b",
"input": "한국의 수도는 어디입니까?"
}'Response
200 OK
| Name | Type | Description |
|---|---|---|
| id | string | 응답의 고유 식별자 |
| object | string | 응답 객체 타입(항상 “response”) |
| created_at | integer | 생성 시각(Unix timestamp, 초 단위) |
| completed_at | integer or null | 완료 시각(completed 상태일 때만 존재) |
| status | string | 응답 상태(completed/failed/in_progress/cancelled/queued/incomplete) |
| model | string | 사용된 모델 이름 |
| output | array | 모델이 생성한 출력 항목 배열 |
| output[].type | string | 출력 항목 타입(예시: “message”) |
| output[].id | string | 출력 항목 ID |
| output[].status | string | 항목 상태(예시: “completed”) |
| output[].role | string | 메시지 작성자 역할(예시: “assistant”) |
| output[].content | array | 콘텐츠 배열 |
| output[].content[].type | string | 콘텐츠 타입(예시: “output_text”) |
| output[].content[].text | string | 생성된 텍스트 |
| output[].content[].annotations | array | 어노테이션 배열 |
| error | object or null | 오류 정보 |
| incomplete_details | object or null | 미완료 사유(reason: max_output_tokens / content_filter) |
| instructions | string or null | 시스템/개발자 메시지 |
| max_output_tokens | integer or null | 최대 출력 토큰 수 |
| parallel_tool_calls | boolean | 병렬 도구 호출 허용 여부 |
| previous_response_id | string or null | 이전 응답 ID |
| reasoning | object or null | reasoning 구성(effort, summary) |
| store | boolean | 응답 저장 여부 |
| temperature | number | 샘플링 온도 |
| text | object | 텍스트 응답 구성(format 등) |
| tool_choice | string / object | 도구 선택 방식 |
| tools | array | 도구 목록 |
| top_p | number | Top P 값 |
| truncation | string | 잘라내기 전략 |
| usage | object | 토큰 사용량 통계 |
| usage.input_tokens | integer | 입력 토큰 수 |
| usage.input_tokens_details.cached_tokens | integer | 캐시된 토큰 수 |
| usage.output_tokens | integer | 출력 토큰 수 |
| usage.output_tokens_details.reasoning_tokens | integer | reasoning 토큰 수 |
| usage.total_tokens | integer | 전체 토큰 수 |
| metadata | object | 메타데이터 |
Error Code
| HTTP status code | ErrorCode 설명 |
|---|---|
| 400 | Bad Request |
| 422 | Prompt Guard 등 정책에 의해 요청이 거절된 경우 |
| 500 | Internal Server Error |
Example
{
"id": "resp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"object": "response",
"created_at": 1741476542,
"status": "completed",
"completed_at": 1741476543,
"error": null,
"incomplete_details": null,
"instructions": null,
"max_output_tokens": null,
"model": "openai/gpt-oss-120b",
"output": [
{
"type": "message",
"id": "msg_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"status": "completed",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "한국의 수도는 서울입니다.",
"annotations": []
}
]
}
],
"parallel_tool_calls": true,
"previous_response_id": null,
"reasoning": {
"effort": null,
"summary": null
},
"store": true,
"temperature": 1.0,
"text": {
"format": {
"type": "text"
}
},
"tool_choice": "auto",
"tools": [],
"top_p": 1.0,
"truncation": "disabled",
"usage": {
"input_tokens": 54,
"input_tokens_details": {
"cached_tokens": 0
},
"output_tokens": 8,
"output_tokens_details": {
"reasoning_tokens": 0
},
"total_tokens": 62
},
"metadata": {}
}{
"id": "resp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"object": "response",
"created_at": 1741476542,
"status": "completed",
"completed_at": 1741476543,
"error": null,
"incomplete_details": null,
"instructions": null,
"max_output_tokens": null,
"model": "openai/gpt-oss-120b",
"output": [
{
"type": "message",
"id": "msg_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"status": "completed",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "한국의 수도는 서울입니다.",
"annotations": []
}
]
}
],
"parallel_tool_calls": true,
"previous_response_id": null,
"reasoning": {
"effort": null,
"summary": null
},
"store": true,
"temperature": 1.0,
"text": {
"format": {
"type": "text"
}
},
"tool_choice": "auto",
"tools": [],
"top_p": 1.0,
"truncation": "disabled",
"usage": {
"input_tokens": 54,
"input_tokens_details": {
"cached_tokens": 0
},
"output_tokens": 8,
"output_tokens_details": {
"reasoning_tokens": 0
},
"total_tokens": 62
},
"metadata": {}
}Prompt Guard 응답
prompt_safety_model 파라미터를 설정한 경우, guard 모델이 prompt를 먼저 검사합니다.
- safe:
model파라미터에 지정된 모델로 요청이 그대로 처리됩니다. - unsafe: 아래와 같은 형태의 guard 결과를 반환하며 요청이 중단됩니다.
{
"guard_result": "unsafe",
"categories": ["S1", "S2"],
"categories_description": ["Violent Crimes", "Non-Violent Crimes"],
"messages": [
"Cannot fulfill the request due to violent content.",
"Cannot respond as it may promote illegal activities."
]
}{
"guard_result": "unsafe",
"categories": ["S1", "S2"],
"categories_description": ["Violent Crimes", "Non-Violent Crimes"],
"messages": [
"Cannot fulfill the request due to violent content.",
"Cannot respond as it may promote illegal activities."
]
}Reasoning 설정
chat_template_kwargs 또는 reasoning 파라미터를 통해 모델별 reasoning(추론 모드) 설정을 제어할 수 있습니다.
- gpt-oss-120b:
reasoning파라미터의effort필드로 추론 깊이를 지정합니다. (low/medium/high, 기본값 medium) - 기타 모델:
chat_template_kwargs파라미터를 사용하며, 설정 방법은 Chat Completions API - Reasoning 설정을 참고하세요.
| 모델 | 파라미터 | 기본 reasoning | 설정 방법 |
|---|---|---|---|
| openai/gpt-oss-120b | reasoning | medium | { “effort”: “low” } / { “effort”: “medium” } (기본) / { “effort”: “high” } |
| 기타 모델 | chat_template_kwargs | 모델마다 상이 | Chat Completions API - Reasoning 설정 참고 |
curl -X 'POST' \
{Simple AI Inference 엔드포인트}/v1/responses \
-H 'Authorization: bearer sai-xxxxxxx...' \
-H 'Content-Type: application/json' \
-d '{
"model": "openai/gpt-oss-120b",
"input": "복잡한 수학 문제를 풀어주세요.",
"reasoning": {
"effort": "high"
}
}'curl -X 'POST' \
{Simple AI Inference 엔드포인트}/v1/responses \
-H 'Authorization: bearer sai-xxxxxxx...' \
-H 'Content-Type: application/json' \
-d '{
"model": "openai/gpt-oss-120b",
"input": "복잡한 수학 문제를 풀어주세요.",
"reasoning": {
"effort": "high"
}
}'참고
Tokenize API
POST /tokenize
개요
Tokenize API는 텍스트를 토큰 ID로 변환합니다. Completion 방식(prompt 기반)과 Chat 방식(messages 기반) 두 가지 요청 타입을 지원합니다. vLLM의 Tokenize API와 호환됩니다.
Request
Context
| Key | Type | Description | Example |
|---|---|---|---|
| Base URL | string | API 요청을 위한 Simple AI Inference URL | Simple AI Inference 엔드포인트 |
| Request Method | string | API 요청에 사용되는 HTTP 메서드 | POST |
| Headers | object | 요청 시 필요한 헤더 정보 | { “Content-Type”: “application/json”, “Authorization”: “bearer sai-xxxxxxx…” } |
| Body Parameters | object | 요청 본문에 포함되는 파라미터 | { “model”: “openai/gpt-oss-120b”, “prompt”: “Hello, world!” } |
Path Parameters
| Name | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|
| None |
Query Parameters
| Name | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|
| None |
Body Parameters - 공통
| Name | Name Sub | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|---|
| model | - | string | ✅ | 토큰화에 사용할 모델을 지정 | “openai/gpt-oss-120b” |
Body Parameters - Completion 방식 (prompt 기반)
| Name | Name Sub | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|---|
| prompt | - | string | ✅ | 토큰화할 텍스트 | “Hello, world!" | ||
| add_special_tokens | - | boolean | ❌ | true이면 특수 토큰(BOS 등)을 프롬프트에 추가 | true | true / false | true |
| return_token_strs | - | boolean | ❌ | true이면 토큰 ID에 해당하는 토큰 문자열도 함께 반환 | false | true / false | true |
Body Parameters - Chat 방식 (messages 기반)
| Name | Name Sub | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|---|
| messages | role | string | ✅ | 대화 내역을 포함하는 메시지 리스트 | [{ “role”: “user”, “content”: “hi” }] | ||
| add_generation_prompt | - | boolean | ❌ | true이면 chat template에 생성 프롬프트를 추가. continue_final_message와 동시에 true로 설정 불가 | true | true / false | true |
| continue_final_message | - | boolean | ❌ | true이면 마지막 메시지가 EOS 없이 열린 형태로 포맷됨. 모델이 새 메시지를 시작하는 대신 해당 메시지를 이어감. add_generation_prompt와 동시에 true로 설정 불가 | false | true / false | false |
| add_special_tokens | - | boolean | ❌ | true이면 chat template가 추가하는 특수 토큰 외에 BOS 등의 특수 토큰을 추가로 삽입. 대부분의 모델은 chat template가 특수 토큰을 처리하므로 기본값 false 사용 권장 | false | true / false | false |
| return_token_strs | - | boolean | ❌ | true이면 토큰 ID에 해당하는 토큰 문자열도 함께 반환 | false | true / false | true |
| chat_template | - | string | ❌ | 변환에 사용할 Jinja 템플릿. 토크나이저에 정의되지 않은 경우 제공 필요 | null | ||
| chat_template_kwargs | - | object | ❌ | 템플릿 렌더러에 전달할 추가 키워드 인자 | null | { “add_generation_prompt”: true } | |
| tools | - | array | ❌ | 모델이 호출할 수 있는 Tool의 리스트 | null |
Example
curl -X 'POST' \
{Simple AI Inference 엔드포인트}/tokenize \
-H 'Authorization: bearer sai-xxxxxxx...' \
-H 'Content-Type: application/json' \
-d '{
"model": "openai/gpt-oss-120b",
"prompt": "Hello, world!"
}'curl -X 'POST' \
{Simple AI Inference 엔드포인트}/tokenize \
-H 'Authorization: bearer sai-xxxxxxx...' \
-H 'Content-Type: application/json' \
-d '{
"model": "openai/gpt-oss-120b",
"prompt": "Hello, world!"
}'curl -X 'POST' \
{Simple AI Inference 엔드포인트}/tokenize \
-H 'Authorization: bearer sai-xxxxxxx...' \
-H 'Content-Type: application/json' \
-d '{
"model": "openai/gpt-oss-120b",
"messages": [
{
"role": "user",
"content": "hi"
}
]
}'curl -X 'POST' \
{Simple AI Inference 엔드포인트}/tokenize \
-H 'Authorization: bearer sai-xxxxxxx...' \
-H 'Content-Type: application/json' \
-d '{
"model": "openai/gpt-oss-120b",
"messages": [
{
"role": "user",
"content": "hi"
}
]
}'Response
200 OK
| Name | Type | Description |
|---|---|---|
| count | integer | 토큰화된 토큰의 개수 |
| max_model_len | integer | 모델이 지원하는 최대 토큰 길이 |
| tokens | array | 토큰화된 토큰 ID 목록 |
| token_strs | array | 토큰 ID에 해당하는 토큰 문자열 목록(return_token_strs가 true인 경우에만 반환) |
Error Code
| HTTP status code | ErrorCode 설명 |
|---|---|
| 400 | Bad Request (model 필드 누락, request body 누락 등) |
| 404 | Model Not Found (지원하지 않는 모델) |
| 500 | Internal Server Error |
Example
{
"max_model_len": 1024,
"count": 6,
"tokens": [638357778, 638357778, 399020470, 1618501362, 2382766391, 2765235376],
"token_strs": null
}{
"max_model_len": 1024,
"count": 6,
"tokens": [638357778, 638357778, 399020470, 1618501362, 2382766391, 2765235376],
"token_strs": null
}{
"max_model_len": 1024,
"count": 6,
"tokens": [638357778, 638357778, 399020470, 1618501362, 2382766391, 2765235376],
"token_strs": ["<|im_start|>", "user", "<|im_sep|>", "hi", "<|im_end|>", ""]
}{
"max_model_len": 1024,
"count": 6,
"tokens": [638357778, 638357778, 399020470, 1618501362, 2382766391, 2765235376],
"token_strs": ["<|im_start|>", "user", "<|im_sep|>", "hi", "<|im_end|>", ""]
}참고
Models API
GET /v1/models
개요
Models API는 Simple AI Inference 모델의 목록을 반환합니다. OpenAI의 Models API와 호환됩니다.
Request
Context
| Key | Type | Description | Example |
|---|---|---|---|
| Base URL | string | API 요청을 위한 Simple AI Inference URL | Simple AI Inference 엔드포인트 |
| Request Method | string | API 요청에 사용되는 HTTP 메서드 | GET |
| Headers | object | 요청 시 필요한 헤더 정보 | { “Authorization”: “bearer sai-xxxxxxx…” } |
| Body Parameters | - | - | GET 요청이므로 Body가 없습니다. |
Path Parameters
| Name | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|
| None |
Query Parameters
| Name | type | Required | Description | Default value | Boundary value | Example |
|---|---|---|---|---|---|---|
| None |
Body Parameters
GET 요청이므로 Body가 없습니다.
Example
curl -X 'GET' \
{Simple AI Inference 엔드포인트}/v1/models \
-H 'Authorization: bearer sai-xxxxxxx...'curl -X 'GET' \
{Simple AI Inference 엔드포인트}/v1/models \
-H 'Authorization: bearer sai-xxxxxxx...'Response
200 OK
| Name | Type | Description |
|---|---|---|
| object | string | 응답 객체의 타입(“list”) |
| data | array | 모델 객체 목록 |
| data[].id | string | 모델의 식별자 |
| data[].object | string | 객체의 타입(“model”) |
| data[].created | integer | 모델이 생성된 시각(Unix timestamp, 초 단위) |
| data[].owned_by | string | 모델의 소유자 |
Error Code
| HTTP status code | ErrorCode 설명 |
|---|---|
| 401 | Unauthorized (apikey 누락 또는 유효하지 않음) |
| 500 | Internal Server Error |
Example
{
"data": [
{
"id": "openai/gpt-oss-120b",
"created": 1780979126,
"object": "model",
"owned_by": "SCP Simple AI Inference"
},
{
"id": "Qwen/Qwen3-VL-Embedding-8B",
"created": 1781512915,
"object": "model",
"owned_by": "SCP Simple AI Inference"
},
{
"id": "Qwen/Qwen3-VL-Reranker-8B",
"created": 1781512915,
"object": "model",
"owned_by": "SCP Simple AI Inference"
}
],
"object": "list"
}{
"data": [
{
"id": "openai/gpt-oss-120b",
"created": 1780979126,
"object": "model",
"owned_by": "SCP Simple AI Inference"
},
{
"id": "Qwen/Qwen3-VL-Embedding-8B",
"created": 1781512915,
"object": "model",
"owned_by": "SCP Simple AI Inference"
},
{
"id": "Qwen/Qwen3-VL-Reranker-8B",
"created": 1781512915,
"object": "model",
"owned_by": "SCP Simple AI Inference"
}
],
"object": "list"
}참고
1.4 - Data Privacy
데이터 개인정보 보호 및 보안
Simple AI Inference는 고객 데이터의 기밀성과 보안을 중요한 원칙으로 삼고 서비스를 운영합니다.
서비스를 통해 전달되는 추론 요청과 응답 데이터는 AI 추론 기능을 제공하고 서비스 운영에 필요한 범위 내에서만 처리됩니다. 해당 데이터는 서비스 제공 목적 외의 용도로 활용되지 않습니다.
Simple AI Inference는 다음 원칙을 준수합니다.
- 고객의 요청 및 응답 데이터는 서비스 제공을 위한 처리 목적에 한하여 사용됩니다.
- 고객의 요청 및 응답 내용을 고객의 동의 없이 제3자에게 제공하거나 공유하지 않습니다.
- 고객의 요청 및 응답 데이터는 AI 모델의 학습 또는 성능 개선을 위한 학습 데이터로 사용하지 않습니다.
1.5 - Release Note
Simple AI Inference
- Simple AI Inference 서비스를 정식 출시하였습니다.
- 다양한 오픈 소스 LLM 모델을 API를 통해 서버리스로 이용할 수 있습니다.
- Samsung Cloud Platform에서 Virtual Server, GPU Server, Kubernetes Engine 자원을 생성한 후, 해당 자원에서 LLM을 이용할 수 있습니다.
2 - Simple AI Training
2.1 - Overview
서비스 개요
Simple AI Training은 데이터 과학자와 머신러닝 엔지니어가 인프라 관리 부담 없이 대규모로 모델을 학습시킬 수 있는 완전 관리형 AI Training 서비스입니다. Simple AI Training 서비스를 통해 환경을 위한 별도의 AI 인프라, 플랫폼 없이 데이터와 학습 코드만 준비하여 손쉽게 모델 학습을 처리하고 결과를 도출할 수 있습니다.
특장점
- 인프라 관리의 복잡성 제거: Simple AI Training의 서비스 백그라운드에서 서비스를 위한 요소를 자동으로 구성하고 서비스 종료 후 자원을 회수하여 별도의 인프라 운영이 필요하지 않습니다.
- 손쉽고 빠른 모델 학습: 복잡한 명령어(CLI) 대신 웹 콘솔 인터페이스를 통해 몇 번의 클릭만으로 모델 학습 작업을 실행할 수 있습니다. 사용자는 학습 스크립트와 데이터가 위치한 스토리지 위치 및 GPU 인스턴스만 지정하면 됩니다.
- 보안성 높은 데이터 퍼리: 클라우드 내 데이터 저장소(Object Storage 등)와 직접 연동되어 외부 유출 걱정 없이 보안이 유지된 상태로 대용량 데이터를 처리합니다.
- 안정적인 모델 학습: 학습 도중 인프라 오류가 발생하더라도 시스템이 자동으로 장애를 탐지하고 복구하여 중단 없는 학습 환경을 제공합니다.
- 효율적인 비용 관리: 우선순위가 낮은 학습에 대해 유휴 GPU를 사용하거나 Samsung Cloud Platform이 Spot 중단 및 재개를 자동으로 관리하여 비용 효율적인 학습이 가능합니다.
서비스 구성도
제공 기능
Simple AI Training는 다음과 같은 기능을 제공하고 있습니다.
- 서버리스 환경 제공: 인프라 설정, 데이터 로딩, 모델 학습, 결과물 저장까지 모든 과정을 자동화하여 학습에만 집중할 수 있습니다.
- 분산 학습 및 Warm Pool 지원: 대규모 모델이나 대용량 데이터셋을 여러 인스턴스에 자동으로 분산하고 연속적인 훈련 작업 시에는 인스턴스를 즉시 재사용하여 인프라 프로비저닝 시간을 단축합니다.
- 커스텀 컨테이너 지원: 사용자의 Docker 컨테이너 이미지를 가져와 학습할 수 있습니다(BYOC: Bring Your Own Container).
- 모델 훈련 가용성: GPU Failover, Checkpointing 기능을 지원하여 모델 훈련을 원활하게 진행할 수 있습니다.
- GPU Failover: 학습 도중 GPU 오류 발생 시 시스템이 자동으로 장애를 탐지 및 복구하여 오류로 인한 중단을 방지합니다.
- Curcurrent Checkpointing: 학습 중간 결과물을 Object Storage에 저장하여 장애 발생 시 체크포인트부터 다시 학습을 재개할 수 있습니다.
- 안전한 데이터 접근: 클라우드 내 데이터 저장소(Object Storage)와 연동되어 데이터를 외부 유출 걱정없이 보안이 유지된 상태로 처리할 수 있습니다.
- 다양한 요금제 제공: 다양한 요금제를 제공하여 비용을 절감하고 효율적인 학습을 수행할 수 있습니다.
제공 서버
Simple AI Training에서는 g2 서버 타입(H100)과 g3 서버 타입(B300)을 제공합니다.
서버 타입에 대한 자세한 사양은 서버 타입을 참고하세요.
| 구분 | 인스턴스 타입 |
|---|---|
| g2 | at.g2v12h1, at.g2v24h2, at.g2v48h4, at.g2v96h8, at.g2.spot |
| g3 | at.g3v16b1, at.g3v16b2, at.g3v16b4, at.g3v16b8, at.g3.spot |
리전별 제공 현황
Simple AI Training 서비스를 제공하는 리전은 다음과 같습니다.
| 리전 | 제공 여부 |
|---|---|
| 한국 서부(kr-west1) | 제공 |
| 한국 동부(kr-east1) | 미제공 |
| 한국 남부1(kr-south1) | 미제공 |
| 한국 남부2(kr-south2) | 미제공 |
| 한국 남부3(kr-south3) | 미제공 |
선행 서비스
해당 서비스를 생성하기 전에 미리 구성되어 있어야 하는 서비스 목록입니다. 자세한 내용은 각 서비스 별로 제공되는 가이드를 참고하여 사전에 준비하세요.
| 서비스 카테고리 | 서비스 | 상세 설명 |
|---|---|---|
| Storage | File Storage | 네트워크 연결을 통하여 다수의 클라이언트 서버가 파일을 공유하는 스토리지 |
| Storage | Object Storage | 데이터 저장 및 검색에 용이한 객체 스토리지 |
| Container | Container Registry | 컨테이너 이미지를 손쉽게 저장, 관리, 공유하는 서비스 |
2.1.1 - 서버 타입
Simple AI Training은 제공하는 GPU Type에 따라 구분되며, Training Job을 생성할 때 선택하는 서버 타입에 따라 Simple AI Training에 사용되는 GPU가 결정됩니다.
Simple AI Training에서 실행하려는 작업의 사양에 따라 서버 타입을 선택하세요.
Simple AI Training에서 지원하는 서버 타입은 다음 형식과 같습니다.
at.g3v16b1
구분 | 예시 | 상세 설명 |
|---|---|---|
| 서비스구분 | at | Simple AI Training 서비스를 의미 |
| 서버 세대 | g3 | 제공하는 서버 구분과 세대
|
| CPU | v16 | vCore 개수
|
| GPU | b1 | GPU 종류 및 수량
|
g2 서버 타입
g2 서버 타입은 NVIDIA H100 SXM GPU를 사용하는 GPU Bare Metal Server로 대규모 고성능 AI 연산에 적합합니다.
- 8개의 NVIDIA Hopper Architecture 기반 H100 GPU 제공
- GPU 당 1,979 TFLOPS FP8 Tensor Core 성능 제공, 989 TFLOPS FP16 Tensor Core 성능 제공
- 최대 96개의 vCPU 및 2,048 GB의 메모리를 지원
- 최대 1,600 Gb/s NVIDIA InfiniBand RDMA 네트워크 지원
- 최대 100 Gbps의 서비스 네트워크
- 노드 내 NVSwitch를 통한 900 GB/s의 GPU P2P 통신
| 인스턴스 구분 | vCPU | Memory | GPU | Local Disk |
|---|---|---|---|---|
| at.g2v12h1 | 12 | 234 | 1 | 10 Gi |
| at.g2v24h2 | 24 | 468 | 2 | 20 Gi |
| at.g2v48h4 | 48 | 936 | 4 | 40 Gi |
| at.g2v96h8 | 96 | 1,872 | 8 | 80 Gi |
| at.g2.spot | 12 | 234 | 1 | 10 Gi |
g3 서버 타입
g3 서버 타입은 NVIDIA B300 SXM GPU를 사용하는 GPU Bare Metal Server로 대규모 고성능 AI 연산 뿐만 아니라 생성형 AI를 위한 LLM 추론 및 AI 배포에 적합합니다.
- 8개의 NVIDIA Blackwell Ultra Architecture 기반 B300 GPU 제공
- GPU 당 13.5 PFLOPS FP4 Tensor Core, 4.5 PFLOPS FP8 Tensor Core 성능 제공
- 최대 128개의 vCPU 및 4,096 GB의 메모리를 지원
- 최대 6,400 Gb/s NVIDIA InfiniBand RDMA 네트워크 지원
- 최대 100 Gbps의 서비스 네트워크
- 노드 내 NVSwitch를 통한 1.8 TB/s의 GPU P2P 통신
| 인스턴스 구분 | vCPU | Memory | GPU | Local Disk |
|---|---|---|---|---|
| at.g3v16b1 | 16 | 480 | 1 | 10 Gi |
| at.g3v32b2 | 32 | 960 | 2 | 20 Gi |
| at.g3v64b4 | 64 | 1,920 | 4 | 40 Gi |
| at.g3v128b8 | 128 | 3,840 | 8 | 80 Gi |
| at.g3.spot | 16 | 480 | 1 | 10 Gi |
2.1.2 - ServiceWatch 지표
Simple AI Training은 ServiceWatch로 지표를 전송합니다. 기본 모니터링으로 제공되는 지표는 5분 주기로 수집된 데이터입니다.
기본 지표
다음은 네임스페이스 Simple AI Training에 대한 기본 지표입니다.
아래에서 지표명이 굵은 글씨로 표기된 지표는 Simple AI Training에서 제공하는 기본 지표 중 주요 지표로 선정한 지표입니다.
주요 지표는 ServiceWatch에서 서비스별로 자동으로 구축되는 서비스 대시보드를 구성하는데 활용됩니다.
각 지표는 해당 지표를 조회할 때 어떤 통계값으로 조회하는 것이 의미있는지 의미 있는 통계값을 사용자 가이드를 통해 안내하고 있으며, 의미있는 통계 중에서 굵은 글씨로 표기된 통계값이 주요 통계값입니다.
서비스 대시보드 또는 모니터링 탭에서는 주요 지표를 주요 통계값을 통해 조회할수 있습니다. 또는 Simple AI Training 상세 페이지의 모니터링 탭에서도 주요 지표에 대해 확인할 수 있습니다.
ServiceWatch의 지표 메뉴에서 GPU Device별 사용률도 확인할 수 있습니다.
| 성능 항목(지표명) | 상세 설명 | 단위 | 의미있는 통계 |
|---|---|---|---|
| CPU Usage | Training Job Pod에서 최근 5분 동안 사용한 평균 CPU Core 수 | Cores |
|
| GPU Utilization | Training Job에서 사용 중인 GPU의 사용률 | Percent |
|
| Memory Usage | Training Job Pod에서 현재 사용 중인 메모리 사용 | Bytes |
|
2.2 - How-to guides
Simple AI Training 서비스의 Training Job을 생성하여 AI 학습 방식을 선택하고 학습을 진행할 수 있습니다.
Training Job 생성하기
Simple AI Training 서비스를 이용하려면 먼저 Training Job을 생성해야 합니다. Trainging Job을 생성하려면 다음 절차를 따르세요.
모든 서비스 > AI/ML > Simple AI Training 메뉴를 클릭하세요. Simple AI Training의 Service Home 페이지로 이동합니다.
Service Home 페이지에서 Training Job 생성 버튼을 클릭하세요. Training Job 생성 페이지로 이동합니다.
Training Job 생성 페이지에서 서비스 생성에 필요한 정보들을 입력하고, 상세 옵션을 선택하세요.
- 필수 정보 입력 영역에서 Training Job 관련 필수 정보를 선택하세요.
구분 필수 여부상세 설명 학습 형태 필수 학습 방식을 선택 - On-Demand Training: 학습을 원하는 시점에 서버를 선점하여 안정적으로 학습 진행
- Concurrent Checkpointing 기능 적용되어 효율적인 체크포인트 저장 지원
- Spot Training: 우선 순위가 낮은 학습에 대해 유휴 GPU를 사용하여 비용 효율적인 학습을 진행
- Concurrent Checkpointing 및 Mixed workload 기능 적용되어 학습의 연속성(자동 중단 및 시작) 지원
- Concurrent Checkpointing 기능에 대한 자세한 설명은 Concurrent Checkpointing 개요 참고
Training Job명 필수 Training Job 이름을 입력 - 영문 소문자, 숫자, 특수문자(-.)를 사용하여 3 ~ 63자 이내로 입력
- 이름의 시작과 끝에 영문 소문자 또는 숫자 필수
분산 Framework 필수 분산 Framework를 버전 선택 - PyTorch, DeepSpeed 선택 가능
표. Training Job 필수 정보 입력 항목 - On-Demand Training: 학습을 원하는 시점에 서버를 선점하여 안정적으로 학습 진행
- 서비스 정보 입력 영역에서 Training Job 생성에 필요한 옵션을 선택하세요.
구분 필수 여부상세 설명 Job Failover 선택 Job Failover 기능의 사용 여부 선택 - Spot Training 기능 사용 시 Job Failover 사용 불가
- Job Failover 기능에 대한 자세한 내용은 Job Failover 사용하기 참고
리소스 할당 필수 학습에 활용할 GPU 수 및 메모리 크기 선택 노드 수 필수 분산 학습 규모를 설정 - 2노드 이상 부터 분산 학습 가능
Shared Memory 필수 분산 학습, 분산 데이터 처리를 위해 프로세스 간 공유할 메모리를 설정 표. Training Job 서비스 정보 입력 항목 - AI Training Image 정보 입력 영역에서 서비스 생성에 필요한 옵션을 선택하세요.
구분 필수 여부상세 설명 AI Training Image URL 필수 사용자의 컨테이너 저장소(SCR, Docker Hub 등) 주소를 입력 사용자 ID 선택 이미지 저장소의 사용자 ID 비밀번호 필수 이미지 저장소의 비밀번호 표. Training Job AI Training Image 정보 입력 입력 항목 - 학습 Command 및 볼륨 정보 입력 영역에서 필요한 정보를 입력 또는 선택하세요.
구분 필수 여부상세 설명 스토리지 연결 선택 추가 볼륨의 사용 여부를 선택 - 사용 시 추가 보륨 Mount 경로 및 학습 스크립트 URL 입력 필
- File Storage Volume Mount Path: File Storage 연결 시 사용할 데이터 경로(예시: /root)
- Training Script 가져오기(Object Storage): Object Storage 연결 시 스크립트 URL 입력
Command 필수 Command 정보를 3 ~ 1,024 이내로 입 표. Training Job AI Training Image 정보 입력 입력 항목 - 추가 정보 입력 영역에서 필요한 정보를 입력 또는 선택하세요.
구분 필수 여부상세 설명 태그 선택 태그 추가 - 자원 당 최대 50개까지 추가 가능
- 태그 추가 버튼을 클릭한 후 Key, Value 값을 입력 또는 선택
표. Training Job 학습 Command 및 볼륨 정보 입력 항목
- 필수 정보 입력 영역에서 Training Job 관련 필수 정보를 선택하세요.
요약 패널에서 생성한 상세 정보를 확인하고, 생성 버튼을 클릭하세요.
생성을 알리는 팝업창이 열리면 확인 버튼을 클릭하세요.
- 생성이 완료되면, Training Job 목록 페이지에서 생성한 자원을 확인하세요.
Training Job 상세 정보 확인하기
Training Job 서비스의 전체 자원 목록과 상세 정보를 확인하고 수정할 수 있습니다.
Training Job 상세정보를 확인하려면 다음 절차를 따르세요.
- 모든 서비스 > AI/ML > Simple AI Training 메뉴를 클릭하세요. Simple AI Training의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Training Job 메뉴를 클릭하세요. Training Job 목록 페이지로 이동합니다.
- Training Job 목록 페이지에서 상세 정보를 확인할 자원을 클릭하세요. Training Job 상세 페이지로 이동합니다.
- Training Job 상세 페이지는 상세 정보, 모니터링, 로그, 태그 탭으로 구성됩니다.
구분 상세 설명 서비스 상태 CloudML의 상태 - Creating: 생성 중
- Deployed: 생성 완료/정상 작동 중
- Updating: 설정 업데이트 중
- Terminating: 삭제 중
- Error: 에러 발생
Training Job 삭제 서비스를 해지하는 버튼 표. Training Job 상세 페이지 항목
- Training Job 상세 페이지는 상세 정보, 모니터링, 로그, 태그 탭으로 구성됩니다.
상세 정보
Training Job 목록 페이지에서 선택한 자원의 상세 정보를 확인할 수 있습니다.
| 구분 | 상세 설명 |
|---|---|
| 서비스 | 서비스명 |
| 자원 유형 | 자원 유형 |
| SRN | Samsung Cloud Platform에서의 고유 자원 ID |
| 자원명 | 자원 이름 |
| 자원 ID | 서비스에서의 고유 자원 ID |
| 생성자 | 서비스를 생성한 사용자 |
| 생성 일시 | 서비스를 생성한 일시 |
| 수정자 | 서비스 정보를 수정한 사용자 |
| 수정 일시 | 서비스 정보를 수정한 일시 |
| 학습 형태 | AI Training 학습 방식 |
| Training Job명 | Training Job 이름 |
| 분산 Framework | 분산 Framework 종류 |
| Job Failover | Job Failover 기능 사용 여부 |
| 리소스 할당 | 리소스로 할당된 GPU 및 메모리 정보 |
| 노드 수 | 노드 수 |
| Shared Memory | 프로세스 간 공유한 메모리 정보 |
| Command | Training Job 생성 시 입력한 Command 정보 |
| Image URL | 사용자의 컨테이너 저장소 주소 |
| File Storage Volume Mount Point | 추가 볼륨 사용 시 연결한 File Storage Mount 경로 |
| Traing Script URL | 추가 볼륨 사용 시 연결한 Object Storage 스크립트 URL |
모니터링
Training Job 목록 페이지에서 선택한 자원의 모니터링 정보를 확인할 수 있습니다.
| 구분 | 상세 설명 |
|---|---|
| 모니터링 | ServiceWatch 서비스의 모니터링 정보를 연계하여 표시
|
로그
Training Job 목록 페이지에서 선택한 자원의 로그 정보를 확인할 수 있습니다.
| 구분 | 상세 설명 |
|---|---|
| Job 로그 | ServiceWatch 서비스의 로그 정보를 연계하여 표시
|
태그
Training Job 목록 페이지에서 선택한 자원의 태그 정보를 확인하고, 추가하거나 변경 또는 삭제할 수 있습니다.
| 구분 | 상세 설명 |
|---|---|
| 태그 목록 | 태그 목록
|
Training Job 로그 확인하기
ServiceWatch 서비스에서 Training Job의 로그를 확인할 수 있습니다.
Training Job의 로그를 확인하려면 다음 절차를 따르세요.
- 모든 서비스 > AI/ML > Simple AI Training 메뉴를 클릭하세요. Simple AI Training의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Training Job 메뉴를 클릭하세요. Training Job 목록 페이지로 이동합니다.
- Training Job 목록 페이지에서 로그를 확인할 자원을 선택하세요. Training Job 상세 페이지로 이동합니다.
- Training Job 상세 페이지에서 로그 탭을 클릭하세요. 해당 Job의 로그 정보가 표시됩니다.
- 로그 정보의 Training Job명 하단의 이름을 클릭하세요. ServiceWatch의 로그 그룹 상세 페이지로 이동합니다.
- 로그 그룹 상세 페이지에서 로그 스트림 탭을 클릭하세요. 로그 스트림 목록이 표시됩니다.
- 확인할 로그 스트림 이름(예시: master)을 클릭하세요. 해당 스트림의 로그가 시간순으로 표시됩니다.
- Failover가 발생한 경우, 장애로 중단되었던 학습의 로그와 재배치 후 다시 시작된 학습의 로그가 하나의 스트림에 함께 기록됩니다.
- 학습 시작 시 출력되는 초기화 로그(예시: Starting dataset initialization)가 두 번 이상 표시되면, 학습이 재배치되어 다시 시작되었음을 확인할 수 있습니다.
Training Job 삭제하기
사용하지 않는 Training Job을 삭제할 수 있습니다. Training Job을 삭제하려면 다음 절차를 따르세요.
- 모든 서비스 > AI/ML > Simple AI Training 메뉴를 클릭하세요. Simple AI Training의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Training Job 메뉴를 클릭하세요. Training Job 목록 페이지로 이동합니다.
- Training Job 목록 페이지에서 삭제할 자원을 선택한 후, 목록 상단의 삭제 버튼을 클릭하세요.
- 삭제할 자원을 클릭하여 Training Job 상세 페이지로 이동한 후, 개별적으로 삭제할 수도 있습니다.
- 삭제를 알리는 팝업창이 열리면 확인 버튼을 클릭하세요.
Training Workspace 사용하기
Training Workspace를 사용하여 Simple AI Training 서비스를 이용할 수 있습니다.
Training Workspace 생성하기
Training Workspace를 생성하려면 다음 절차를 따르세요.
모든 서비스 > AI/ML > Simple AI Training 메뉴를 클릭하세요. Simple AI Training의 Service Home 페이지로 이동합니다.
Service Home 페이지에서 Training Workspace 메뉴를 클릭하세요. Training Workspace 목록 페이지로 이동합니다.
Training Workspace 목록 페이지에서 서비스 생성 버튼을 클릭하세요. Training Workspace 생성 페이지로 이동합니다.
서비스 생성에 필요한 정보들을 입력하고, 상세 옵션을 선택하세요.
- 서비스 정보 입력 영역에서 Training Workspace 생성에 필요한 옵션을 선택하세요.
구분 필수 여부상세 설명 Training Workspace명 필수 Training Workspace 이름을 입력 - 영문 소문자, 숫자, 특수문자(-.)를 사용하여 63자 이내로 입력
리소스 할당 필수 학습에 활용할 GPU 수 및 메모리 크기 선택 노드 수 필수 분산 학습 규모를 설정 - 2노드 이상 부터 분산 학습 가능
약정 기간 필수 서비스 이용 약정 기간을 선택 표. Training Workspace 서비스 정보 입력 항목
- 서비스 정보 입력 영역에서 Training Workspace 생성에 필요한 옵션을 선택하세요.
요약 패널에서 생성한 상세 정보와 예상 청구 금액을 확인하고, 생성 버튼을 클릭하세요.
생성을 알리는 팝업창이 열리면 확인 버튼을 클릭하세요.
- 생성이 완료되면, Training Workspace 목록 페이지에서 생성한 자원을 확인하세요.
Training Workspace 수정하기
Training Workspace의 노드 수를 수정할 수 있습니다. Training Workspace를 수정하려면 다음 절차를 따르세요.
- 모든 서비스 > AI/ML > Simple AI Training 메뉴를 클릭하세요. Simple AI Training의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Training Workspace 메뉴를 클릭하세요. Training Workspace 목록 페이지로 이동합니다.
- Training Workspace 목록 페이지에서 수정할 자원의 더보기 > 수정 버튼을 클릭하세요. Training Workspace 수정 페이지로 이동합니다.
- Training Workspace 수정 페이지에서 노드 수를 확인하고 수정하세요.
- 수정이 완료되면 확인 버튼을 클릭하세요.
Training Workspace 삭제하기
사용하지 않는 Training Workspace를 삭제할 수 있습니다. Training Workspace를 삭제하려면 다음 절차를 따르세요.
- 모든 서비스 > AI/ML > Simple AI Training 메뉴를 클릭하세요. Simple AI Training의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Training Workspace 메뉴를 클릭하세요. Training Workspace 목록 페이지로 이동합니다.
- Training Workspace 목록 페이지에서 삭제할 자원을 선택한 후, 목록 상단의 서비스 해지 버튼을 클릭하세요.
- 삭제할 자원의 더보기 > 서비스 해지 버튼을 클릭하여 개별적으로 삭제할 수도 있습니다.
- 삭제를 알리는 팝업창이 열리면 확인 버튼을 클릭하세요.
2.2.1 - Job Failover 사용하기
Job Failover는 On-Demand Training으로 학습을 진행하는 도중 GPU 등 하드웨어 장애가 발생하더라도 학습이 중단되지 않도록 정상 자원으로 자동 재배치하여 학습을 이어가는 기능입니다. Job Failover 기능을 사용하면 시스템 오류 및 하드웨어 장애 감지 시 사용자가 직접 장애를 확인하고 Job을 다시 생성할 필요 없이 학습의 연속성을 확보할 수 있습니다.
Job Failover 개요
Training Job 실행 중에는 학습이 배치된 노드에서 GPU 오류, 노드 장애 등 다양한 하드웨어 이상이 발생할 수 있습니다.
Job Failover 기능을 사용하면 이러한 하드웨어 장애가 감지되었을 때 시스템이 장애 노드를 회피하여 정상 자원으로 Training Job을 자동 재배치하고 학습을 재개합니다.
Job Failover의 주요 동작은 다음과 같습니다.
- 장애 감지: 학습이 실행 중인 노드의 GPU 및 하드웨어 상태를 지속적으로 점검하여 이상을 감지합니다.
- 자동 재배치: 하드웨어 장애로 판단되면 장애 노드를 제외하고 정상 노드로 Training Job을 재배치하여 학습을 다시 시작합니다.
- 불필요한 재배치 방지: 하드웨어 장애가 아닌 사용자 코드 오류, 설정 오류 등은 Failover 대상에서 제외됩니다.
- 재시도 횟수 제한: Failover는 정해진 최대 횟수(3회) 내에서만 수행되며, 이를 초과하면 학습이 실패로 종료됩니다.
- Job Failover는 Training Job 생성 시 학습 형태를 On-Demand Training 타입으로 선택한 경우에만 사용할 수 있습니다. Spot Training 사용 시에는 Job Failover를 사용할 수 없습니다.
- Job Failover 기능의 사용 여부는 Training Job 생성 시 서비스 정보 입력 영역의 Job Failover 항목에서 선택할 수 있습니다. 생성 이후에는 Training Job 상세 페이지의 상세 정보 탭에서 사용 여부를 확인할 수 있습니다.
- Failover로 학습이 다른 자원에 재배치되면 학습이 중단된 시점의 메모리 상태는 유지되지 않습니다. 학습을 이어서 진행하려면 공유 스토리지(File Storage, Object Storage)에 체크포인트를 저장하도록 학습 스크립트를 구성하는 것을 권장합니다.
- Failover가 항상 즉시 실행을 보장하지는 않습니다.
- Failover로 재배치되는 Job은 우선 순위가 높게 설정되어 대기 중인 다른 Job 보다 먼저 자원을 할당받아 실행됩니다.
- 단, 재배치 시점에 이미 대기열에 들어와 있던 Job의 우선순위와 대기 순서에 따라 재배치되는 Job이 해당 Job들 보다 늦게 실행될 수 있습니다.
- Job의 재배치 여부를 결정하기 위해 노드 상태를 점검하는 동안(최대 5분) Job이 Pending - failoverinprogress 상태에 머무를 수 있습니다.
오류 원인 점검
시스템은 학습 중단이 발생하면 노드의 GPU 및 하드웨어 상태를 점검하여, 그 원인이 하드웨어 장애인지 아니면 사용자 애플리케이션, 설정과 같은 하드웨어 이외의 문제인지 판단합니다.
Failover 수행 여부는 이 판단 결과에 따라 결정됩니다.
하드웨어 장애로 판단되는 경우
GPU를 정상적으로 사용할 수 없는 물리적, 하드웨어 수준의 오류가 감지되면 하드웨어 장애로 판단하여 Failover를 수행합니다.
이러한 오류는 해당 노드에서 학습을 계속할 수 없으므로 장애 노드를 제외하고 정상 자원으로 재배치하여 학습을 재개합니다.
하드웨어 장애로 판단되는 오류 예시는 다음과 같습니다.
| XID 코드 | 오류 | 설명 |
|---|---|---|
| 48 | GPU 메모리(HBM) 복구 불가능 오류 (Uncorrectable Double Bit ECC) |
|
| 79 | GPU가 시스템에서 분리됨 (GPU fallen off the bus) |
|
| 94, 95 | GPU 내부 메모리(SRAM) 복구 불가능 오류 |
|
| - | GPU 과열, 전원 공급 장치(PSU), PCIe 등 하드웨어 구성 요소 장애 |
|
내부 오류로 판단되는 경우
학습 중단의 원인이 하드웨어 장애가 아니라 사용자 애플리케이션 코드나 설정 문제로 판단되면, 재배치를 하더라도 동일한 문제가 반복될 가능성이 높으므로 Failover를 거부하고 internalerror 상태로 종료합니다. 내부 오류로 판단되는 오류 예시는 다음과 같습니다.
| XID 코드 | 오류 | 설명 |
|---|---|---|
| - | 메모리 부족으로 인한 강제 종료 (Out Of Memory) |
|
| 31 | GPU 메모리 페이지 폴트 |
|
| 43 | GPU 처리 중단 |
|
| 13 | 그래픽·컴퓨트 엔진 예외 |
|
| - | GPU 설정 경고, 소프트웨어 오류 등 |
|
- XID 코드: NVIDIA GPU 드라이버가 오류 종류를 구분하기 위해 부여하는 번호로써, GPU 로그에서 오류 원인을 파악하는 데 참고할 수 있습니다.
- 이 경우에는 학습 스크립트와 실행 Command, 입력 데이터, 리소스 설정 등을 점검하세요. 로그 확인 방법에 대한 자세한 내용은 Job Failover 로그 확인하기를 참고하세요.
Job Failover 상태 확인하기
- 모든 서비스 > AI/ML > Simple AI Training 메뉴를 클릭하세요. Simple AI Training의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Training Job 메뉴를 클릭하세요. Training Job 목록 페이지로 이동합니다.
- Training Job 목록 페이지에서 Job의 상태를 확인하세요.
- Failover 사용 여부와 하드웨어 장애 판단 결과에 따른 상태 흐름은 다음과 같습니다.
구분 상세 설명 Failover 성공 하드웨어 장애가 감지되어 정상 자원으로 재배치가 완료된 상태 - Running → Pending - failoverinprogress → Running 순서로 상태가 변경되면 Failover가 정상적으로 수행되어 학습 재개 완료
Failover 거부 학습이 중단되었으나 하드웨어 장애 신호가 확인되지 않아 재배치 대상이 아니라고 판단된 상태 - Running → Pending - failoverinprogress → Pending - internalerror 순서로 상태가 변경되면 Failover가 거부
- 사용자 코드 오류와 같이 하드웨어 이외의 원인일 수 있으므로 로그 확인 필요
Failover 미설정 Job Failover를 사용하지 않도록 설정한 상태 - 학습 중단이 발생하면 재배치를 시도하지 않고 Running → Failed 순서로 학습을 종료
표. Job Failover에 따른 상태 흐름 - Failover 진행 중 표시되는 주요 상태값은 다음과 같습니다.
상태 상세 설명 Pending - failoverinprogress 하드웨어 장애를 감지하고 Failover 가능 여부를 판단하거나 정상 자원으로 재배치를 진행 중인 상태 Pending - maxretriesexceeded Failover 최대 시도 횟수를 초과하여 더 이상 재배치를 수행하지 않는 상태 Pending - imagepullbackoff 컨테이너 이미지를 불러오지 못해 학습을 시작할 수 없는 상태(이미지 URL 및 인증 정보 확인 필요) Pending - internalerror 하드웨어 장애 신호가 확인되지 않는 등 Failover 대상이 아니라고 판단되어 재배치가 거부된 상태 표. Job Failover 진행 중 주요 상태값
- Failover 사용 여부와 하드웨어 장애 판단 결과에 따른 상태 흐름은 다음과 같습니다.
Job Failover 로그 확인하기
Failover가 발생한 경우, 장애로 중단된 이전 학습의 로그와 재배치 후에 재개된 학습의 로그를 하나의 로그 스트림에서 함께 확인할 수 있습니다.
Training Job 로그를 확인하는 방법은 Training Job 로그 확인하기를 참고하세요.
- 모든 서비스 > AI/ML > Simple AI Training 메뉴를 클릭하세요. Simple AI Training의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Training Job 메뉴를 클릭하세요. Training Job 목록 페이지로 이동합니다.
- Training Job 목록 페이지에서 로그를 확인할 자원을 선택하세요. Training Job 상세 페이지로 이동합니다.
- Training Job 상세 페이지에서 로그 탭을 클릭하세요. 해당 Job의 로그 정보가 표시됩니다.
- 로그 정보의 Training Job명 하단의 이름을 클릭하세요. ServiceWatch의 로그 그룹 상세 페이지로 이동합니다.
- 로그 그룹 상세 페이지에서 로그 스트림 탭을 클릭하세요. 로그 스트림 목록이 표시됩니다.
- 확인할 로그 스트림 이름(예시: master)을 클릭하세요. 해당 스트림의 로그가 시간순으로 표시됩니다.
- Failover가 발생한 경우, 장애로 중단되었던 학습의 로그와 재배치 후 다시 시작된 학습의 로그가 하나의 스트림에 함께 기록됩니다.
- 학습 시작 시 출력되는 초기화 로그(예시: Starting dataset initialization)가 두 번 이상 표시되면, 학습이 재배치되어 다시 시작되었음을 확인할 수 있습니다.
2.2.2 - Concurrent Checkpointing
Concurrent Checkpointing은 기존 방식과 달리 Forward/Backward 연산 중에도 체크포인트를 비동기적으로 저장하는 기능입니다.
따라서 이 기능을 사용하여 체크포인트 저장으로 인한 오버헤드를 줄여 전체 학습 시간을 효율적으로 단축하고, 예측 불가능한 학습 중단 발생 시 유실될 수 있는 학습 진행 상태를 자동으로 저장할 수 있습니다.
Concurrent Checkpointing 개요
Simple AI Training에서 제공하는 Training Job은 On-Demand Training 타입과 Spot Training 타입이 있습니다.
Concurrent Checkpointing은 두 가지 타입에서 모두 사용할 수 있으나 타입별로 기능의 활용 범위가 다릅니다. 타입별 활용 범위는 다음과 같습니다.
| 타입 | 활용 범위 |
|---|---|
| On-Demand Training |
|
| Spot Training |
|
Concurrent Checkpointing 사용하기
사전 준비하기: 스크립트 작성
사용자는 Trainer, Concurrent Checkpoint의 save method를 동시에 사용할 수 있습니다.
- Concurrent Checkpoint가 저장하는 체크포인트는 safetensor format이 아닙니다. 따라서 추후 safetensor format이 필요하다면 Huggingface Trainer의 checkpointing 기능도 함께 사용하는 것을 권장합니다.
- Concurrent Checkpoint가
TrainingArgument중 공유하는 것은output_dir입니다. - Concurrent Checkpoint가 유지하는 checkpoint수는 최대 3개입니다.
Spot Training 사용법
Spot Training 사용 시 스크립트 예시는 다음과 같습니다.
|language = python | title = Training Script Example | collapse = true
// transformers==5.10.2 기준으로 작성합니다.
import os
import torch
from transformers import (
AutoTokenizer,
AutoModelForCausalLM,
Trainer,
TrainingArguments,
DataCollatorForLanguageModeling
)
from datasets import load_dataset
import json
from datastates.llm import DecoratedCheckpointing
import argparse
import logging
import time
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument(
"--local_rank",
type=int,
default=-1,
help="local rank passed from distributed launcher (Deepspeed, torchrun, etc.)"
)
return parser.parse_args()
if __name__ == "__main__":
args = parse_args()
model_path="/root/.cache/huggingface/hub/models--meta-llama--Llama-3.2-1B/snapshots/4e20de362430cd3b72f300e6b0f18e50e7166e08"
# Load tokenizer and model
tokenizer = AutoTokenizer.from_pretrained(model_path, local_files_only=True)
# Set pad token to EOS if not already defined
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
# Load WikiText-2 dataset
dataset = load_dataset("wikitext", "wikitext-2-raw-v1",cache_dir="/root/.cache/huggingface/datasets")
# Tokenization function
def tokenize_function(examples):
return tokenizer(
examples["text"],
truncation=True,
max_length=128,
padding="max_length"
)
# Tokenize the dataset
tokenized_dataset = dataset.map(
tokenize_function,
batched=True,
remove_columns=["text"]
)
train_dataset = tokenized_dataset["train"]
valid_dataset = tokenized_dataset["validation"]
data_collator = DataCollatorForLanguageModeling(
tokenizer=tokenizer,
mlm=False # Causal LM (not masked LM)
)
script_directory = os.path.dirname(os.path.abspath(__file__))
ds_config_path = os.path.join(script_directory, "ds_config.json")
training_args = TrainingArguments(
output_dir="./results",
num_train_epochs=3,
per_device_train_batch_size=2, # Adjust based on GPU memory
gradient_accumulation_steps=4, # Effective batch size = batch_size * gradient_accumulation_steps
save_strategy="steps",
save_steps=200,
logging_steps=2,
eval_strategy="steps",
eval_steps=100,
bf16=True, # Enable BF16 mixed precision (use fp16 if unsupported)
deepspeed=ds_config_path, # Path to DeepSpeed config file
report_to="none",
)
model = AutoModelForCausalLM.from_pretrained( model_path, local_files_only=True, low_cpu_mem_usage=True, device_map=None)
# Initialize Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=valid_dataset, # Optional: validation set for evaluation
processing_class=tokenizer,
data_collator=data_collator,
)
# ADD configuration for Concurrent CHECKPOINT ENGINE
config = {
"host_cache_size": 50,
"parser_threads": 1,
"pin_host_cache": True,
"trainer": trainer,
}
ckpt_engine = DecoratedCheckpointing(runtime_config=config, rank=args.local_rank)
resume_from_checkpoint=False
if os.getenv("CKPT_LAST_STEP") != None :
resume_from_checkpoint=True
trainer.train(resume_from_checkpoint=resume_from_checkpoint)// transformers==5.10.2 기준으로 작성합니다.
import os
import torch
from transformers import (
AutoTokenizer,
AutoModelForCausalLM,
Trainer,
TrainingArguments,
DataCollatorForLanguageModeling
)
from datasets import load_dataset
import json
from datastates.llm import DecoratedCheckpointing
import argparse
import logging
import time
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument(
"--local_rank",
type=int,
default=-1,
help="local rank passed from distributed launcher (Deepspeed, torchrun, etc.)"
)
return parser.parse_args()
if __name__ == "__main__":
args = parse_args()
model_path="/root/.cache/huggingface/hub/models--meta-llama--Llama-3.2-1B/snapshots/4e20de362430cd3b72f300e6b0f18e50e7166e08"
# Load tokenizer and model
tokenizer = AutoTokenizer.from_pretrained(model_path, local_files_only=True)
# Set pad token to EOS if not already defined
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
# Load WikiText-2 dataset
dataset = load_dataset("wikitext", "wikitext-2-raw-v1",cache_dir="/root/.cache/huggingface/datasets")
# Tokenization function
def tokenize_function(examples):
return tokenizer(
examples["text"],
truncation=True,
max_length=128,
padding="max_length"
)
# Tokenize the dataset
tokenized_dataset = dataset.map(
tokenize_function,
batched=True,
remove_columns=["text"]
)
train_dataset = tokenized_dataset["train"]
valid_dataset = tokenized_dataset["validation"]
data_collator = DataCollatorForLanguageModeling(
tokenizer=tokenizer,
mlm=False # Causal LM (not masked LM)
)
script_directory = os.path.dirname(os.path.abspath(__file__))
ds_config_path = os.path.join(script_directory, "ds_config.json")
training_args = TrainingArguments(
output_dir="./results",
num_train_epochs=3,
per_device_train_batch_size=2, # Adjust based on GPU memory
gradient_accumulation_steps=4, # Effective batch size = batch_size * gradient_accumulation_steps
save_strategy="steps",
save_steps=200,
logging_steps=2,
eval_strategy="steps",
eval_steps=100,
bf16=True, # Enable BF16 mixed precision (use fp16 if unsupported)
deepspeed=ds_config_path, # Path to DeepSpeed config file
report_to="none",
)
model = AutoModelForCausalLM.from_pretrained( model_path, local_files_only=True, low_cpu_mem_usage=True, device_map=None)
# Initialize Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=valid_dataset, # Optional: validation set for evaluation
processing_class=tokenizer,
data_collator=data_collator,
)
# ADD configuration for Concurrent CHECKPOINT ENGINE
config = {
"host_cache_size": 50,
"parser_threads": 1,
"pin_host_cache": True,
"trainer": trainer,
}
ckpt_engine = DecoratedCheckpointing(runtime_config=config, rank=args.local_rank)
resume_from_checkpoint=False
if os.getenv("CKPT_LAST_STEP") != None :
resume_from_checkpoint=True
trainer.train(resume_from_checkpoint=resume_from_checkpoint)다음 절차의 예시를 참고하여 스크립트를 작성하세요.
- Import Concurrent CHECKPOINT
from datastates.llm import DecoratedCheckpointing
...
- ADD configuration for Concurrent CHECKPOINT ENGINE
config = {
"host_cache_size": 50,
"parser_threads": 1,
"pin_host_cache": True,
"trainer": trainer,
}
예시 그대로 입력하는 것을 추천하며, 메모리 이슈 발생 시 담당자에게 host_cache_size 가용 가능 값을 요청합니다.
host_cache_size: 사용될 host의 pinned memory 크기이며 단위는 GB입니다.trainer: 위에서 초기화한 huggingface trainer를 넣어줍니다.
- Initialize Concurrent CHECKPOINT ENGINE
ckpt_engine = DecoratedCheckpointing(runtime_config=config, rank=args.local_rank)
- Set Concurrent CHECKPOINT ENGINE parameter
resume_from_checkpoint=False
if os.getenv("CKPT_LAST_STEP") != None :
resume_from_checkpoint=True
trainer.train(resume_from_checkpoint=resume_from_checkpoint)
Concurrent Checkpoint 저장 경로
저장 경로는 기본적으로 TrainingArgument의 output_dir을 기반으로 합니다.
해당 output_dir 하위 경로에 concurrent_checkpoint라는 디렉토리 하위에 저장됩니다.
output_dir 경로에 저장된 checkpoint중 가장 최신(예시: 가장 step 숫자가 큰 checkpoint)으로 로드됩니다.On-Demand Training 사용하기
On-Demand Training 사용 방법 Spot Training 사용 방법과 유사합니다.
최초 학습
다음 절차의 예시를 참고하여 스크립트를 작성하세요.
- Import Concurrent CHECKPOINT
from datastates.llm import DecoratedCheckpointing
...
- ADD configuration for Concurrent CHECKPOINT ENGINE
config = {
"host_cache_size": 50,
"parser_threads": 1,
"pin_host_cache": True,
"trainer": trainer,
}
예시 그대로 입력하는 것을 추천하며, 메모리 이슈 발생 시 담당자에게 host_cache_size 가용 가능 값을 요청합니다.
host_cache_size: 사용될 host의 pinned memory 크기이며 단위는 GB입니다.trainer: 위에서 초기화한 huggingface trainer를 넣어줍니다.
- Initialize Concurrent CHECKPOINT ENGINE
ckpt_engine = DecoratedCheckpointing(runtime_config=config, rank=args.local_rank)
- Set Concurrent CHECKPOINT ENGINE parameter
trainer.train(resume_from_checkpoint=False)
수동 활성화 시
최초 학습 시 지정한 output_dir 경로에 유효한 체크포인트가 확인될 경우, 학습 재실행 시 해당 체크포인트 경로를 직접 model initialize 시 지정하여 로드합니다.
또는 학습을 재실행할 때 기존 output_dir과 동일하게 지정하고 다음과 같이 설정하여 최신 체크포인트를 자동으로 로드할 수 있습니다.
다음 절차의 예시를 참고하여 스크립트를 작성하세요.
- Import Concurrent CHECKPOINT
from datastates.llm import DecoratedCheckpointing
...
- ADD configuration for Concurrent CHECKPOINT ENGINE
config = {
"host_cache_size": 50,
"parser_threads": 1,
"pin_host_cache": True,
"trainer": trainer,
}
예시 그대로 입력하는 것을 추천하며, 메모리 이슈 발생 시 담당자에게 host_cache_size 가용 가능 값을 요청합니다.
host_cache_size: 사용될 host의 pinned memory 크기이며 단위는 GB입니다.trainer: 위에서 초기화한 huggingface trainer를 넣어줍니다.
- Initialize Concurrent CHECKPOINT ENGINE
ckpt_engine = DecoratedCheckpointing(runtime_config=config, rank=args.local_rank)
- Set Concurrent CHECKPOINT ENGINE parameter
trainer.train(resume_from_checkpoint=True)
Job 실행하기
Training Job 생성 화면의 Command 필드에 사용하고자 하는 명령어와 함께 기능 관련 환경 변수를 추가하여 실행합니다.
| language = go
PYTHONPATH=$CHECKPOINT_VENDOR HF_DATASETS_OFFLINE="1" ${USER_SCRIPT}
PYTHONPATH=$CHECKPOINT_VENDOR: 기능 활성화를 위한 라이브러리 경로를 로드하도록 설정합니다.HF_DATASETS_OFFLINE=“1”: Samsung Cloud Platform 망은 huggingface 로그인 및 모델/데이터셋 다운로드를 지원하지 않습니다. 따라서 사용자 스크립트에서 huggingface 네트워크 호출을 방지하는 용도로 설정합니다.
예시
기본 코드
| language = actionscript
- python 파일
python /mnt/experiment/training/compatiblitiy-test/version_check.py
- deepspeed
deepspeed --num_gpus=2 /mnt/experiment/training/compatiblitiy-test/train_llama_8b-demo.py
- accelerate
accelerate launch --config_file /mnt/experiment/training/compatiblitiy-test/sat-test/fsdp_config.yaml --num_processes 4 /mnt/experiment/training/compatiblitiy-test/sat-test/train_llama_1b-demo.py
기능 사용 시
| language = actionscript
- python 파일
PYTHONPATH=$CHECKPOINT_VENDOR python /mnt/experiment/training/compatiblitiy-test/version_check.py
- deepspeed
PYTHONPATH=$CHECKPOINT_VENDOR deepspeed --num_gpus=4 /mnt/experiment/training/compatiblitiy-test/train_llama_8b-demo.py
- accelerate
PYTHONPATH=$CHECKPOINT_VENDOR accelerate launch --config_file /mnt/experiment/training/compatiblitiy-test/sat-test/fsdp_config.yaml --num_processes 4 /mnt/experiment/training/compatiblitiy-test/sat-test/train_llama_1b-demo.py
transformers==5.10.2
numpy==2.4.6
pybind11==3.0.4
safetensors==0.8.0
torch==2.12.1
torchvision==0.27.1
datasets==4.8.4
pytest
cuda-bindings~=13.2.0
packaging<=26.0
#--- test deepspeed version library
deepspeed==0.18.9
accelerate==1.13.0
진행 상황 확인
진행 상황은 Training Job 상세 페이지의 로그 탭에서 확인할 수 있습니다.
진행 상황을 확인하려면 다음 절차를 따르세요.
- 모든 서비스 > AI/ML > Simple AI Training 메뉴를 클릭하세요. Simple AI Training의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Training Job 메뉴를 클릭하세요. Training Job 목록 페이지로 이동합니다.
- Training Job 목록 페이지에서 상세 정보를 확인할 자원을 클릭하세요. Training Job 상세 페이지로 이동합니다.
- 로그 탭을 클릭한 후, 로그를 확인하세요. 환경 준비 상태로 로그를 확인할 수 있습니다.
| language = actionscript | title =
[INFO] Concurrent Checkpoint library is installed
waiting for validator through /channel/stage.socket...
validator is running....
sidecar container is running and ready for training process to run!
- 사용 환경은 Concurrent Checkpoint 기능의 사용 여부와 상관 없이 On-Demand Training 타입과 Spot Training 타입 모두 제공됩니다.
- On-Demand Training 타입의 경우, 자동 Parameter 기능을 지원하지 않으므로 기능 사용 시 다음과 같이 Parameter 관련 에러 로그가 발생할 수 있습니다. 단, 최신 체크포인트 로드 기능은 정상 동작합니다.
| language = actionscript | title =
[2026-07-10 01:50:09,939] [ERROR] [decorator.py:442:get_last_checkpoint_preprocess] [Concurrent Checkpoint] No Checkpoint found with step: -1
ERROR:datastates.llm.decorator:[Concurrent Checkpoint] No Checkpoint found with step: -1
2.3 - Release Note
Simple AI Training
- Simple AI Training 서비스를 정식 출시하였습니다.
- 모델 학습 환경을 위한 별도의 AI 인프라, 플랫폼을 직접 구축하거나 관리할 필요 없이 학습에 필요한 리소스를 즉시 할당받아 사용할 수 있습니다.
3 - CloudML
3.1 - Overview
서비스 개요
CloudML은 클라우드 환경에서 데이터 분석부터 모델 개발, 학습, 검증, 배포까지 머신러닝 전 과정을 지원하는 통합 플랫폼입니다.
특장점
- Cloud ML은 분석가, 머신러닝 엔지니어, 개발자 등 다양한 역할의 사용자가 하나의 환경에서 협업하고, 손쉽게 머신러닝 워크플로우를 설계하고 운영할 수 있도록 설계되었습니다.
- Cloud ML은 Python과 R을 기반으로 분석 환경을 제공하며, 프로그래밍 경험이 있는 사용자는 더욱 유연하고 효과적으로 플랫폼을 활용할 수 있습니다. 특히, 생성형 AI 기반의 Copilot 기능을 이용하면 자연어 입력만으로 코드 작성, 리펙토링, 오류 수정, 함수 추천 등을 손쉽게 수행할 수 있어, 분석 생산성과 분석 접근성을 높여줍니다.
- Cloud ML은 분석 환경 구성, 모델 개발 및 서빙, 분석 자동화, 시각화 등 각 단계를 체계적으로 지원합니다. 반복적인 실험과 운영 자동화를 통해 생산성과 모델 품질을 모두 향상시킬 수 있도록 지원합니다.
서비스 구성도
CloudML은 분석 환경, 머신러닝 라이프사이클 관리, 자동분석 지원, 시각화, 생성형 AI 기반 Copilot 기능 등으로 구성되어 있으며, 사용자는 이 구성요소를 통해 머신러닝 전 과정을 통합적으로 수행할 수 있습니다.
제공 기능
CloudML은 다음과 같은 기능을 제공하고 있습니다.
- 시각적 모델링: Drag&Drop 방식으로 코딩 없이 머신러닝 모델을 구축하고 배포할 수 있는 직관적인 인터페이스를 제공합니다. 데이터 불러오기부터 모델 평가, 배포까지 모든 과정을 쉽게 관리할 수 있습니다.
- 코드 기반 개발: Jupyter Notebook 환경에서 Python, R 등을 사용하여 자유롭게 코드를 작성하고 실행할 수 있습니다. 고급 사용자 및 연구자를 위한 강력한 기능을 제공합니다.
- 워크플로우 자동화: 데이터 전처리, 모델 학습, 평가, 배포 등 복잡한 머신러닝 워크플로우를 효율적으로 자동화합니다.
- 실험 관리: 다양한 파라미터 조합으로 머신러닝 모델을 학습시키고, 그 결과를 체계적으로 관리하고 비교할 수 있습니다.
- Copilot 기능 활용: 자연어 기반의 AI 어시스턴트 기능을 제공하여 모델 개발 과정을 가이드하고 자동화합니다. 코드 생성, 리펙토링, 오류 수정, 설명 등 다양한 작업을 지원하여 생산성을 향상시킵니다.
- 통합 플랫폼: 모든 기능이 CloudML 내에서 통합되어 편리하게 사용할 수 있습니다.
- 확장성 및 유연성: 필요에 따라 컴퓨팅 자원 확장 및 다양한 데이터 소스 연결을 지원합니다.
제약 사항
CloudML 사용 전 아래 제약 사항을 반드시 확인하고, 서비스 이용 계획에 반영하세요. Cloud ML은 Kubernetes 기반 환경에서 동작하므로, 안정적인 서비스 운영을 위해 적절한 클러스터 자원 설정이 필요합니다.
- Application 기본 자원: Application 구동을 위해 최소 vCPU 24코어, 메모리 96GBi가 기본적으로 할당됩니다.
- 분석 작업 자원: 분석 작업 수행을 위해서는 위 기본 자원 외에 추가적인 CPU 또는 GPU 자원 설정이 필요합니다. 분석 작업의 부하량을 고려하여 적절히 설정해야 합니다.
- Copilot (CPU 기반 사용): Copilot을 CPU 자원에서 실행하려면 최소 vCPU 16코어, 메모리 10GBi가 필요합니다. 이 경우, 분석 작업에 사용 가능한 CPU 자원은 그만큼 줄어듭니다.
- Copilot (GPU 기반 사용): Copilot은 전용 GPU 자원을 설정하여 사용할 수도 있습니다.
- 지원 LLM 모델: 현재 Copilot에 적용 가능한 LLM 모델은 Llama3로 제한됩니다.
리전별 제공 현황
CloudML은 아래의 환경에서 제공 가능합니다.
| 리전 | 제공 여부 |
|---|---|
| 한국 서부(kr-west1) | 제공 |
| 한국 동부(kr-east1) | 제공 |
| 한국 남부1(kr-south1) | 미제공 |
| 한국 남부2(kr-south2) | 미제공 |
| 한국 남부3(kr-south3) | 미제공 |
선행 서비스
해당 서비스를 생성하기 전에 미리 구성되어 있어야 하는 서비스 목록입니다. 자세한 내용은 각 서비스 별로 제공되는 가이드를 참고하여 사전에 준비하세요.
| 서비스 카테고리 | 서비스 | 상세 설명 |
|---|---|---|
| Container | Container Registry | 컨테이너 이미지를 저장, 관리, 공유하는 서비스 |
| Container | Kubernetes Engine | Kubernetes 컨테이너 오케스트레이션 서비스 |
| Networking | Load Balancer | 서버 트래픽 부하를 자동으로 분산하는 서비스 |
3.2 - How-to guides
CloudML 생성하기
사용자는 Samsung Cloud Platform Console을 통해 CloudML의 필수 정보를 입력하고, 상세 옵션을 선택하여 해당 서비스를 생성할 수 있습니다.
CloudML을 생성하려면 다음 절차를 따르세요.
모든 서비스 > AI/ML > CloudML 메뉴를 클릭하세요. CloudML의 Service Home 페이지로 이동합니다.
Service Home 페이지에서 CloudML 생성 버튼을 클릭하세요. CloudML 페이지로 이동합니다.
CloudML 생성 페이지에서 서비스 생성에 필요한 정보들을 입력하고, 상세 옵션을 선택하세요.
버전 선택 영역에서 해당 서비스의 버전을 선택하세요.
구분 필수 여부상세 설명 버전 선택 필수 CloudML 버전 선택 표. CloudML 서비스 버전 선택 항목SCP Kubernetes Engine에서 배포 영역에서 서비스 생성에 필요한 옵션을 선택하세요.
구분 필수 여부상세 설명 클러스터명 필수 Kubernetes Engine 클러스터 선택 표. CloudML 서비스 클러스터 선택 항목서비스 정보 입력 영역에서 서비스 생성에 필요한 옵션을 선택하세요.
구분 필수 여부상세 설명 CloudML명 필수 서비스명 입력 설명 선택 서비스 설명 입력 도메인명 필수 서비스에서 사용할 도메인명 입력 - 영문 소문자, 숫자, 특수문자를 사용해 2-63자 입력
엔드포인트 필수 서비스에서 사용할 엔드포인트 선택 - Private과 Public 중 선택
Copilot 선택 서비스에서 Copilot 사용 여부 선택 - 신청 선택 시 팝업창에서 약관 동의 필요
- 선택한 클러스터가 LLM 전용 GPU로 구성되지 않고, LLM 할당 자원이 충분하지 않은 경우 Copilot 신청 불가
자원 정보 필수 선택한 클러스터의 자원 정보 표시 SCR 정보 입력 필수 서비스에서 사용할 SCR 정보 입력 - 프라이빗 엔드포인트, 인증키, 시크릿 키 입력
표. CloudML 서비스 정보 입력 항목추가 정보 입력 영역에서 필요한 정보를 입력 또는 선택하세요.
구분 필수 여부상세 설명 태그 선택 태그 추가 - 자원 당 최대 50개까지 추가 가능
- 태그 추가 버튼을 클릭한 후 Key, Value 값을 입력 또는 선택
표. CloudML 추가 정보 입력 항목
요약 패널에서 생성한 상세 정보와 예상 청구 금액을 확인하고, 완료 버튼을 클릭하세요.
- 생성이 완료되면, CloudML 목록 페이지에서 생성한 자원을 확인하세요.
CloudML 상세 정보 확인하기
CloudML 서비스의 전체 자원 목록과 상세 정보를 확인하고 수정할 수 있습니다. CloudML 상세 페이지는 상세 정보, 태그, 작업 이력 탭으로 구성되어 있습니다.
CloudML 상세정보를 확인하려면 다음 절차를 따르세요.
- 모든 서비스 > AI/ML > CloudML 메뉴를 클릭하세요. CloudML의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 상세 정보를 확인할 자원(CloudML)을 클릭하세요. CloudML 상세 페이지로 이동합니다.
- CloudML 상세 페이지에는 CloudML의 상태 정보 및 상세 정보가 표시되며, 상세 정보, 태그, 작업 이력 탭으로 구성됩니다.
구분 상세 설명 서비스 상태 CloudML의 상태 - Creating: 생성 중
- Deployed: 생성 완료/정상 작동 중
- Updating: 설정 업데이트 중
- Terminating: 삭제 중
- Error: 에러 발생
접속 가이드 서비스 접속 가이드 - 사용자 PC에 등록할 host 정보 안내
서비스 해지 서비스를 해지하는 버튼 표. CloudML 상태 정보 및 부가 기능
- CloudML 상세 페이지에는 CloudML의 상태 정보 및 상세 정보가 표시되며, 상세 정보, 태그, 작업 이력 탭으로 구성됩니다.
상세 정보
CloudML 목록 페이지에서 선택한 자원의 상세 정보를 확인하고, 필요한 경우 정보를 수정할 수 있습니다.
| 구분 | 상세 설명 |
|---|---|
| 서비스 | 서비스명 |
| 자원 유형 | 자원 유형 |
| SRN | Samsung Cloud Platform에서의 고유 자원 ID |
| 자원명 | 자원 이름 |
| 자원 ID | 서비스에서의 고유 자원 ID |
| 생성자 | 서비스를 생성한 사용자 |
| 생성 일시 | 서비스를 생성한 일시 |
| 수정자 | 서비스 정보를 수정한 사용자 |
| 수정 일시 | 서비스 정보를 수정한 일시 |
| 상품명 | CloudML 이름 |
| Copilot | Copilot 사용 여부 |
| 설명 | 서비스에 대한 설명 |
| 클러스터명 | 선택한 Kubernetes Engine 클러스터명 |
| 도메인명 | 입력한 서비스 도메인명 |
| 버전 | 선택한 서비스 버전 |
| 설치 노드 정보 | 클러스터에 설치된 노드 정보 |
| SCR 정보 | 입력한 SCR 정보 |
태그
CloudML 목록 페이지에서 선택한 자원의 태그 정보를 확인하고, 추가하거나 변경 또는 삭제할 수 있습니다.
| 구분 | 상세 설명 |
|---|---|
| 태그 목록 | 태그 목록
|
작업 이력
CloudML 목록 페이지에서 선택한 자원의 작업 이력을 확인할 수 있습니다.
| 구분 | 상세 설명 |
|---|---|
| 작업 이력 목록 | 자원 변경 이력
|
CloudML 서비스 해지하기
사용자는 Samsung Cloud Platform Console을 통해 CloudML 서비스를 해지할 수 있습니다.
CloudML을 해지하려면 다음 절차를 따르세요.
- 모든 서비스 > AI/ML > CloudML 메뉴를 클릭하세요. CloudML의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 서비스 해지 버튼을 클릭하세요. 서비스 해지 알림창이 나타납니다.
- 알림창에서 삭제할 CloudML 이름을 입력하고 확인 버튼을 클릭하세요.
3.2.1 - Kubernetes 클러스터 구성
Kubernetes 클러스터 구성하기
CloudML 서비스를 신청하기 위해서는 CloudML만을 위한 전용 클러스터가 구성되어 있어야 합니다. 전용 클러스터란 요구되는 최소 사양 이상의 Kubernetes Engine을 생성하고 몇 가지 필요 사항을 설정하는 것을 의미합니다. CloudML 서비스를 신청하기 전에 전용 클러스터를 미리 생성하세요.
- 클러스터를 생성하는 방법은 클러스터 생성 가이드를 참고하세요.
- CloudML은 443 포트의 HTTPS 엔드포인트를 노출합니다. 클러스터 생성 시 퍼블릭 엔드포인트를 선택하세요.
클러스터 노드 및 저장소 권장 사양
클러스터 노드는 클러스터 생성 후 추가하거나 수정할 수 있습니다. 다음은 사용자 5명을 기준으로 CloudML를 설치하기 위해 준비되어야 하는 클러스터 노드 및 저장소의 권장 사양입니다.
| 구분 | 항목 | 역할 | 용량 |
|---|---|---|---|
| 클러스터 노드 | Kubernetes 노드 풀 (Virtual Server) | Application 구동
| 24 core / 96 GBi |
| 클러스터 노드 | Kubernetes 노드 풀 (Virtual Server) | Analysis 실행
| 8 core / 32 GBi x 2 EA
|
| 저장소 | File Storage | 데이터 저장 | 1 TB |
노드 개수의 변경, GPU 노드 추가 또는 리소스 증설 등 사양 변경이 필요한 경우에는 기술 지원을 요청하세요.
- 기술 지원 안내 페이지: https://www.samsungsds.com/kr/support/support_tech.html
- 기술 지원 신청 메일: brightics.cs@samsung.com
노드에 라벨 추가하기
클러스터 노드 및 저장소 권장 사양에서 제시한 역할별로 노드에 라벨을 직접 추가하세요.
- 노드 YAML에 라벨을 추가하는 방법은 노드 YAML 편집하기 가이드를 참고하세요.
클러스터 노드에 라벨을 추가하려면 다음 절차를 따르세요.
- 모든 서비스 > Container > Kubernetes Engine 메뉴를 클릭하세요. Kubernetes Engine의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 노드 메뉴를 클릭하세요. 노드 목록 페이지로 이동합니다.
- 노드 목록 페이지에서 상세 정보를 확인하려는 클러스터를 왼쪽 상단의 톱니바퀴 버튼에서 선택한 후, 확인 버튼을 클릭하세요.
- 상세 정보를 확인하려는 노드를 선택해 클릭하세요. 노드 상세 페이지로 이동합니다.
- 노드 상세 페이지에서 YAML 탭을 클릭하세요. YAML 탭 페이지로 이동합니다.
- YAML 탭 페이지에서 편집 버튼을 클릭하세요. 노드 편집창이 열립니다.
- 노드 편집창에서 역할에 맞는 라벨을 추가하고 저장 버튼을 클릭하세요.
- 다음 정보를 확인해 노드 사양에 맞는 라벨을 추가합니다.
구분 목적별 라벨 CPU 노드 - 앱용:
node.kubernetes.io/nodetype: ml-app
- 분석용:
node.kubernetes.io/nodetype: ml-analytics
GPU 노드 - 분석용:
node.kubernetes.io/nodetype: ml-analytics-gpu
- copilot용:
node.kubernetes.io/nodetype: ml-gpu
표. Kubernetes 노드의 목적별 라벨 항목 - 앱용:
- 다음 정보를 확인해 노드 사양에 맞는 라벨을 추가합니다.
3.3 - API Reference
3.4 - CLI Reference
3.5 - Release Note
CloudML
- Samsung Cloud Platform을 통해 클라우드 환경에서 데이터 분석부터 모델 개발, 학습, 검증, 배포까지 머신러닝 전 과정을 지원하는 CloudML 서비스를 출시하였습니다.
4 - AI&MLOps Platform
4.1 - Overview
서비스 개요
AI&MLOps Platform은 머신러닝 모델의 개발, 학습, 배포 과정 전체 파이프라인의 반복적인 작업을 자동화하는 머신러닝 플랫폼입니다. AI&MLOps Platform 서비스를 통해 Kubernetes 기반의 AI/MLOps 환경을 기반으로, 학습 데이터와 모델, 운영 데이터의 통합적인 관리가 가능합니다.
AI&MLOps Platform은 머신러닝 모델의 개발, 학습, 튜닝, 배포 기능을 활용할 수 있는 오픈소스 상품인 Kubeflow.Mini 서비스와 분산학습 Job 실행 및 모니터링 등 Add-on 기능을 추가한 Enterprise 서비스를 제공합니다.
특장점
Cloud Native MLOps 환경 제공: AI&MLOps Platform은 클라우드에 최적화된 머신러닝 모델 개발 환경을 제공하며, Kubernetes 기반으로 다양한 오픈소스와의 연계가 편리합니다.
머신 러닝 개발 및 운영 편의성: TensorFlow, PyTorch, scikit-learn, Keras 등 다양한 머신러닝 프레임워크를 지원하는 표준화된 환경을 제공합니다. 머신러닝 모델의 개발, 학습, 배포 과정의 전체 Pipeline을 자동화하여 제공함으로써 모델 구성 및 생성이 쉽고 재사용이 용이합니다.
GPU 연계 활용 강화: Bare Metal Server 기반의 Multi Node GPU 및 GPUDirect RDMA(Remote Direct Memory Access)를 통해 LLM(Large Language Model)과 자연어처리(NLP)의 Job 속도를 획기적으로 개선할 수 있습니다.
서비스 구성도
제공 기능
AI&MLOps Platform은 다음과 같은 기능을 제공하고 있습니다.
ML 모델 개발 환경 및 기능
- Notebook 제공: ML Framework(Tensorflow, Pytorch 등)를 포함한 Jupyter Notebook과 VS Code를 생성합니다.
- TensorBoard: TensorBoard(*ML 모델 학습과정 시각화/분석 도구) 서버를 생성하고 관리합니다.
- Volumes: ML 모델 개발 시 데이터셋과 모델 저장, Jupyter Notebook 생성 시 Volume 연결하여 사용합니다.
ML 모델 분산훈련 Job 수행/관리
- 분산학습 Job 실행 및 모니터링, 추론서비스 관리 및 분석을 지원합니다. (Add-on)
- Job Queue 관리 등 MLOps 환경 구성을 위한 다양한 기능을 제공합니다. (Add-on)
- Job Scheduler(FIFO, Bin-packing, Gang 기반), GPU Fraction, GPU 자원 모니터링 등 효율적인 GPU 자원 활용 기능을 제공합니다. (Add-on)
- BM 기반의 Multi Node GPU 및 GPU Direct RDMA(Remote Direct Memory Access)를 통해LLM(Large Language Model)과 자연어처리(NLP)의 Job 속도를 획기적으로 개선하였습니다. (Add-on)
ML 모델 실험관리 및 파이프라인
- ML 파이프라인 실험관리를 위한 Experiments(KFP)를 제공합니다.
- ML Task를 단계적으로 구성하여 실행하기 위한 Pipeline 자동화 구성 기능을 지원합니다.
구성 요소
운영체제 버전
AI&MLOps Platform에서 지원하는 운영체제는 다음과 같습니다.
| 운영체제(OS) | 버전 |
|---|---|
| RHEL | RHEL 8.3 |
| Ubuntu | Ubuntu 18.04, Ubuntu 20.04, Ubuntu 22.04 |
리전별 제공 현황
AI&MLOps Platform은 아래의 환경에서 제공 가능합니다.
| 리전 | 제공 여부 |
|---|---|
| 한국 서부(kr-west1) | 제공 |
| 한국 동부(kr-east1) | 제공 |
| 한국 남부1(kr-south1) | 미제공 |
| 한국 남부2(kr-south2) | 미제공 |
| 한국 남부3(kr-south3) | 미제공 |
선행 서비스
해당 서비스를 생성하기 전에 미리 구성되어 있어야 하는 서비스 목록입니다. 자세한 내용은 각 서비스 별로 제공되는 가이드를 참고하여 사전에 준비하세요.
| 서비스 카테고리 | 서비스 | 상세 설명 |
|---|---|---|
| Container | Kubernetes Engine | Kubernetes 컨테이너 오케스트레이션 서비스 |
4.2 - How-to guides
AI&MLOps Platform 생성하기
사용자는 Samsung Cloud Platform Console을 통해 AI&MLOps Platform의 필수 정보를 입력하고, 상세 옵션을 선택하여 해당 서비스를 생성할 수 있습니다.
AI&MLOps Platform을 생성하려면 다음 절차를 따르세요.
- 모든 서비스 > AI/ML > AI&MLOps Platform 메뉴를 클릭하세요. AI&MLOps Platform의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 AI&MLOps Platform 생성 버튼을 클릭하세요. AI&MLOps Platform 생성 페이지로 이동합니다.
- AI&MLOps Platform 생성의 서비스 유형 선택 페이지에서 서비스 생성에 필요한 정보들을 입력하고, 상세 옵션을 선택하세요.
- 서비스 유형 및 버전 선택 영역에서 서비스 유형을 선택하세요.
구분 필수 여부상세 설명 서비스 유형 필수 사용자가 선택하는 서비스 유형 - AI&MLOps Platform
- Kubeflow Mini
서비스 유형 버전 필수 선택한 서비스의 버전 선택 - 제공하는 서비스의 버전 리스트 제공
표. AI&MLOps Platform 서비스 유형 및 버전 선택 항목 - 클러스터 배포 영역 구분 영역에서 서비스 생성에 필요한 옵션을 선택하세요.
구분 필수 여부상세 설명 클러스터 배포 영역 필수 - Kubernetes Engine에서 배포: 기존에 생성한 Kubernetes Engine을 선택
- 새 클러스터에 배포: AI&MLOps Platform 생성 시에 Kubernetes Engine을 함께 생성
표. AI&MLOps Platform 서비스 클러스터 배포 영역 구분 항목참고해당 클러스터 배포 설정에 따라 다음 서비스 정보 입력 페이지의 설정 요소들이 달라집니다.
- 서비스 유형 및 버전 선택 영역에서 서비스 유형을 선택하세요.
- AI&MLOps Platform 생성의 서비스 정보 입력 페이지에서 서비스 생성에 필요한 정보들을 입력하고, 상세 옵션을 선택하세요.
- 클러스터 배포 영역을 선택할 수 있습니다.
- 새 클러스터에 배포 설정 방법은 새 클러스터에 배포 가이드를 참고하세요.
- SCP Kubernetes Engine에서 배포 설정 방법은 SCP Kubernetes Engine에서 배포 가이드를 참고하세요.
- 설치에 필요한 Kubernetes 클러스터 사양은 설치에 필요한 Kubernetes 클러스터 사양 가이드를 참고하세요.
- 클러스터 배포 영역을 선택할 수 있습니다.
- AI&MLOps Platform 생성의 생성 정보 확인 페이지에서 생성한 상세 정보와 예상 청구 금액을 확인하고, 완료 버튼을 클릭하세요.
- 생성이 완료되면, AI&MLOps Platform 서비스 목록 페이지에서 생성한 자원을 확인하세요.
AI&MLOps Platform 상세 정보 확인하기
AI&MLOps Platform 서비스는 전체 자원 목록과 상세 정보를 확인하고 수정할 수 있습니다. AI&MLOps Platform 서비스 상세 페이지에서는 상세 정보, 태그, 작업 이력 탭으로 구성되어 있습니다.
AI&MLOps Platform 서비스의 상세 정보를 확인하려면 다음 절차를 따르세요.
- 모든 서비스 > AI/ML > AI&MLOps Platform 서비스 메뉴를 클릭하세요. AI&MLOps Platform 서비스의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 AI&MLOps Platform 메뉴를 클릭하세요. AI&MLOps Platform 서비스 목록 페이지로 이동합니다.
- AI&MLOps Platform 서비스 목록 페이지에서 상세 정보를 확인할 자원을 클릭하세요. AI&MLOps Platform 서비스 상세 페이지로 이동합니다.
- AI&MLOps Platform 서비스 상세 페이지에는 상태 정보 및 부가 기능 정보가 표시되며, 상세 정보, 태그, 작업 이력 탭으로 구성됩니다.
상세 정보
AI&MLOps Platform 서비스 목록 페이지에서 선택한 자원의 상세 정보를 확인하고, 필요한 경우 정보를 수정할 수 있습니다.
| 구분 | 상세 설명 |
|---|---|
| 서비스 | 서비스명 |
| 자원 유형 | 자원 유형 |
| SRN | Samsung Cloud Platform에서의 고유 자원 ID |
| 자원명 | 자원 이름
|
| 자원 ID | 서비스에서의 고유 자원 ID |
| 생성자 | 서비스를 생성한 사용자 |
| 생성 일시 | 서비스를 생성한 일시 |
| 수정자 | 서비스 정보를 수정한 사용자 |
| 수정 일시 | 서비스 정보를 수정한 일시 |
| 대시보드상태 | 대시보드 상태값 |
| 서비스명 | 서비스 이름 |
| Admin Email Address | 관리자 이메일 주소 |
| 이미지명 | 서비스 이미지 이름 |
| 버전 | 이미지 버전 |
| 서비스 유형 | 베포된 서비스 유형 |
태그
AI&MLOps Platform 서비스 목록 페이지에서 선택한 자원의 태그 정보를 확인하고, 추가하거나 변경 또는 삭제할 수 있습니다.
| 구분 | 상세 설명 |
|---|---|
| 태그 목록 | 태그 목록
|
작업 이력
AI&MLOps Platform 서비스 목록 페이지에서 선택한 자원의 작업 이력을 확인할 수 있습니다.
| 구분 | 상세 설명 |
|---|---|
| 작업 이력 목록 | 자원 변경 이력
|
AI&MLOps Platform 접속하기
AI&MLOps Platform 대시보드에 접속하려면 하시 사전작업이 선행되어야 합니다.
사전작업
해당 AI&MLOps Platform 접속하기 위해서 사전에 Security Group과 Firewall(방화벽 사용 시)에 관련 포트와 접속이 필요한 IP를 설정해야 합니다.
Kubeflow Mini: 31390 포트 (Security Group의 인바운드 룰, VPC 방화벽)
클러스터 Worker Node에 접근하려면 Security Group과 Firewall (VPC 방화벽 사용 시)에 22 포트의 인바운드 룰을 설정해야 합니다.
대시보드 접속하기
AI&MLOps Platform 서비스에 접속하려면 다음 절차를 따르세요.
- 모든 서비스 > AI/ML > AI&MLOps Platform 서비스 메뉴를 클릭하세요. AI&MLOps Platform 서비스의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 AI&MLOps Platform 서비스 메뉴를 클릭하세요. AI&MLOps Platform 서비스 목록 페이지로 이동합니다.
- AI&MLOps Platform 서비스 목록 페이지에서 상세 정보를 확인할 자원을 클릭하세요. AI&MLOps Platform 상세 페이지로 이동합니다.
- AI&MLOps Platform 상세 페이지에서 접속 가이드 버튼을 클릭하세요. 접속 가이드 팝업창이 열립니다.
- 접속 가이드 팝업창에서 대시보드의 URL 링크 를 클릭하세요. 해당 대시보드 페이지로 이동합니다.
AI&MLOps Platform 해지하기
사용하지 않는 해당 서비스를 해지하여 운영 비용을 절감할 수 있습니다. 단, 서비스를 해지하면 운영 중인 서비스가 즉시 중단될 수 있으므로 서비스 중단 시 발생하는 영향을 충분히 고려한 후 해지 작업을 진행해야 합니다.
AI&MLOps Platform을 해지하려면 다음 절차를 따르세요.
- 모든 서비스 > AI/ML > AI&MLOps Platform 서비스 메뉴를 클릭하세요. AI&MLOps Platform 서비스의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 AI&MLOps Platform 서비스 메뉴를 클릭하세요. AI&MLOps Platform 서비스 목록 페이지로 이동합니다.
- AI&MLOps Platform 서비스 목록 페이지에서 상세 정보를 확인할 자원을 클릭하세요. AI&MLOps Platform 상세 페이지로 이동합니다.
- AI&MLOps Platform 상세 페이지에서 서비스 해지 버튼을 클릭하세요. 서비스 해지 팝업창이 열립니다.
- 확인을 위해 서비스명을 입력한 후 확인을 클릭하세요.
- 해지가 완료되면, AI&MLOps Platform 서비스 목록 페이지에서 자원이 해지되었는지 확인하세요.
4.2.1 - 클러스터 배포
클러스터 배포 영역
Samsung Cloud Platform에서 AI&MLOps Platform 생성의 서비스 유형 선택에서 2가지의 클라우드 배포 영역을 제공하고 있습니다.
클러스터 배포 작업을 진행하기 전에 꼭 설치에 필요한 Kubernetes 클러스터 사양을 확인하세요.
- 클러스터 배포 영역의 선택에 상관없이 사전에 Kubernetes 클러스터 사양을 확인해야 합니다.
- 상세한 사양 정보는 클러스터 사양 가이드를 참고하세요.
클러스터 배포 영역의 선택에 따라 AI&MLOps Platform 생성의 서비스 정보 입력 페이지의 설치 내용이 달라집니다.
SCP Kubernetes Engine에서 배포
- 모든 서비스 > AI/ML > AI&MLOps Platform 메뉴를 클릭하세요. AI&MLOps Platform의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 AI&MLOps Platform 생성 버튼을 클릭하세요. AI&MLOps Platform 생성 페이지로 이동합니다.
- AI&MLOps Platform 생성의 서비스 유형 및 버전 선택 페이지에서 서비스 생성에 필요한 정보들을 입력하고, 상세 옵션을 선택하세요.클러스터 배포SCP Kubernetes Engine에서 배포 옵션을 선택하세요.
- AI&MLOps Platform 생성의 서비스 정보 입력 페이지에서 서비스 생성에 필요한 정보들을 입력하고, 상세 옵션을 선택하세요.
- 서비스 정보 입력 영역에서 서비스 생성에 필요한 정보들을 입력하거나 조회하세요.
구분 필수 여부상세 설명 서비스명 필수 AI&MLOps Platform 이름 입력 - AI&MLOps Platform 이름은 프로젝트 내에서 중복하여 사용 불가
Storage Class 필수 Storage Class는 자동으로 등록 설치 노드 정보 조회 선택한 Kubernetes Engine의 노드 정보를 확인 Admin Email Address 필수 로그인 시 사용할 관리자(Admin)의 이메일 주소 입력 비밀번호 필수 로그인 시 사용할 비밀번호를 입력 비밀번호 확인 필수 비밀번호 오류를 방지하기 위해 비밀번호 재입력 표. AI&MLOps Platform 서비스 정보 입력 항목 - 추가 정보 입력 영역에서 서비스 생성에 필요한 정보들을 입력하거나 선택하세요.
구분 필수 여부상세 설명 태그 선택 AI&MLOps Platform에 추가할 태그 선택 - 태그 추가를 클릭하면 태그를 생성하여 추가하거나 기존 태그를 추가
- 태그는 최대 50개까지 등록
- 추가한 신규 태그는 서비스 생성 완료 후 적용
표. AI&MLOps Platform 서비스 추가 정보 입력 항목
- 서비스 정보 입력 영역에서 서비스 생성에 필요한 정보들을 입력하거나 조회하세요.
새 클러스터에 배포
- 모든 서비스 > AI/ML > AI&MLOps Platform 메뉴를 클릭하세요. AI&MLOps Platform의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 AI&MLOps Platform 생성 버튼을 클릭하세요. AI&MLOps Platform 생성 페이지로 이동합니다.
- AI&MLOps Platform 생성의 서비스 유형 및 버전 선택 페이지에서 서비스 생성에 필요한 정보들을 입력하고, 상세 옵션을 선택하세요.클러스터 배포새 클러스터에 배포 옵션을 선택하세요.
- AI&MLOps Platform 생성의 서비스 정보 입력 페이지에서 서비스 생성에 필요한 정보들을 입력하고, 상세 옵션을 선택하세요.
서비스 정보 입력 영역에서 서비스 생성에 필요한 정보들을 입력하거나 조회하세요.
구분 필수 여부상세 설명 서비스명 필수 AI&MLOps Platform 이름 입력 - AI&MLOps Platform 이름은 프로젝트 내에서 중복하여 사용 불가
Storage Class 필수 Storage Class는 자동으로 등록 설치 노드 정보 조회 선택한 Kubernetes Engine의 노드 정보를 확인 Admin Email Address 필수 로그인 시 사용할 관리자(Admin)의 이메일 주소를 입력 비밀번호 필수 로그인 시 사용할 비밀번호를 입력 비밀번호 확인 필수 비밀번호 오류를 방지하기 위해 비밀번호 재입력 표. AI&MLOps Platform 서비스 정보 입력 항목Kubernetes Engine 정보입력 영역에서 필요한 정보를 입력 또는 선택하세요.
구분 필수 여부상세 설명 클러스터명 필수 클러스터 이름 - 영문으로 시작하며 영문, 숫자, 특수문자(
-) 사용
- 3~30자 이내로 입력
제어 영역 설정 > Kubernetes 버전 필수 Kubernetes 버전 선택 제어 영역 설정 > 제어 영역 로깅 선택 제어 영역 로깅 사용 여부 선택 - 클러스터 제어 영역의 Audit/Event 로그를 Cloud Monitoring의 로그 분석에서 확인 가능
- Account 내 전체 서비스 대상으로 1GB의 로그 저장은 무료로 제공되며, 1GB가 넘을 경우 순차적으로 삭제됨
- 자세한 내용은 Cloud Monitoring > 로그 분석을 참고
네트워크 설정 필수 노드 풀의 네트워크 연결 설정 - VPC: 미리 생성한 VPC를 선택
- Availability Zone: 선택한 VPC의 Availability Zone 선택
- Subnet: 선택한 VPC의 서브넷 중 사용할 일반 Subnet을 선택
- Security Group: 검색 버튼을 클릭한 후 Security Group 선택 팝업창에서 Security Group을 선택
- Load Balancer: Kubernetes Service 객체에서
type:LoadBalancer기능 제공- 동일 네트워크 상의 로드 밸런서를 선택
- 사용 여부를 선택
- 설정 후에는 변경 불가
File Storage 설정 필수 클러스터에서 사용할 파일 스토리지 볼륨을 선택 - 기본 볼륨(NFS): 검색 버튼을 통해 File Storage를 선택
- 기본 Volume 파일 스토리지는 NFS 형식만 제공
표. Kubernetes Engine 서비스 정보 입력 항목- 영문으로 시작하며 영문, 숫자, 특수문자(
노드 풀 정보 입력 영역에서 필요한 정보를 입력 또는 선택하세요.
구분 필수 여부상세 설명 노드 풀 구성 필수 노드 풀 정보를 선택 - * 표시된 항목은 필수 입력 항목이므로 반드시 입력
- AI&MLOps Platform의 경우 사용에 따라 이미지 용량이 지속적으로 늘어날 수 있으므로 Block Storage를 최소 200GB 이상으로 설정 시 원활한 시스템 구성이 가능
표. AI&MLOps Platform 서비스 정보 입력 항목참고- Windows OS의 노드 풀은 클러스터에서 추가 스토리지(CIFS) 볼륨이 사용 중인 경우에만 생성할 수 있습니다.
- 노드 풀 Block Storage의 볼륨 암호화는 최초 생성 시에만 설정할 수 있습니다.
- 암호화를 설정하면 일부 기능의 성능 저하가 발생할 수 있습니다.
- 노드 풀 자동 확장 또는 축소 기능을 사용으로 선택한 경우에만 노드 수, 최소 노드 수, 최대 노드 수 를 입력할 수 있습니다.
추가 정보 입력 영역에서 필요한 정보를 입력 또는 선택하세요.
구분 필수 여부상세 설명 태그 선택 AI&MLOps Platform에 추가할 태그 선택 - 태그 추가를 클릭하면 태그를 생성하여 추가하거나 기존 태그를 추가
- 태그는 최대 50개까지 등록
- 추가한 신규 태그는 서비스 생성 완료 후 적용
표. AI&MLOps Platform 서비스 정보 입력 항목
클러스터 사양
AI&MLOps Platform을 이용하려면 AI&MLOps Platform을 설치할 Kubernetes Engine이 필요합니다. 기존에 생성한 Kubernetes Engine을 선택하거나, AI&MLOps Platform 생성 시 함께 Kubernetes Engine을 생성할 수 있습니다.
설치에 필요한 Kubernetes 클러스터의 사양은 다음과 같습니다.
노드 풀 자원 규모 (2개 이상의 노드로 구성)
- AI&MLOps Platfom : vCPU 32, Memory 128G 이상
- Kubeflow Mini: vCPU 24, Memory 96G 이상
Kubernetes 버전
- AI&MLOps Platform v1.9.1 (k8s v1.30)
- Kubeflow Mini v1.9.1 (k8s v1.30)
4.2.2 - Kubeflow 사용 가이드
아래에서는 Kubeflow를 생성한 후, Kubeflow의 사용 방법에 대해 가이드합니다.
Kubeflow 사용자 추가
아래에서는 Kubeflow를 생성한 이후의 Kubeflow의 사용 방법에 대해 가이드합니다.
Kubeflow는 설치 초기 화면에서 입력한 Admin User 1명의 계정만 생성되어있습니다.
Kubeflow Dashboard 이용 시, 초기 사용자 이외에 사용자를 추가하기 위해서는 Dex(Kubeflow의 인증 연계 컴포넌트)의 설정을 변경해야 합니다.
- Dex는 auth 네임스페이스(namespace)에 배포되며, 환경설정은 dex 라는 이름의 configmap 으로 저장되어 있습니다.
다음은 Dex 환경 설정의 예시입니다.
apiVersion: v1
kind: ConfigMap
metadata:
name: dex
namespace: auth
data:
config.yaml: |
issuer: http://dex.auth.svc.cluster.local:5556/dex
storage:
type: kubernetes
config:
inCluster: true
web:
http: 0.0.0.0:5556
logger:
level: "debug"
format: text
oauth2:
skipApprovalScreen: true
enablePasswordDB: true
staticPasswords:
- email: admin@kubeflow.org
hash: $2y$10$Yb9WVbn8pzVSM6fBgKdFae1Bh6Z.XTihi7bNu3sB6/h5bt1JuUOgq
username: admin
userID: 9cb67307-fd6d-4441-9b59-52acd78f4c9e
staticClients:
- id: kubeflow-oidc-authservice
redirectURIs: ["/login/oidc"]
name: 'Dex Login Application'
secret: pUBnBOY80SnXgjibTYM9ZWNzY2xreNGQok apiVersion: v1
kind: ConfigMap
metadata:
name: dex
namespace: auth
data:
config.yaml: |
issuer: http://dex.auth.svc.cluster.local:5556/dex
storage:
type: kubernetes
config:
inCluster: true
web:
http: 0.0.0.0:5556
logger:
level: "debug"
format: text
oauth2:
skipApprovalScreen: true
enablePasswordDB: true
staticPasswords:
- email: admin@kubeflow.org
hash: $2y$10$Yb9WVbn8pzVSM6fBgKdFae1Bh6Z.XTihi7bNu3sB6/h5bt1JuUOgq
username: admin
userID: 9cb67307-fd6d-4441-9b59-52acd78f4c9e
staticClients:
- id: kubeflow-oidc-authservice
redirectURIs: ["/login/oidc"]
name: 'Dex Login Application'
secret: pUBnBOY80SnXgjibTYM9ZWNzY2xreNGQok 환경 설정에서 enablePasswordDB 값이 true인 경우, Dex는 서비스 기동 시 configmap 에서 staticPasswords 에 정의된 사용자 목록을 내부 저장소에 저장합니다. 따라서 staticPasswords에 email, hash, username, userID 로 구성된 신규 사용자 값을 추가하게 되면 초기 사용자 이외에도 사용자를 자유롭게 추가하여 Kubeflow 서비스 이용이 가능합니다.
사용자를 추가하기 위한 속성값은 다음과 같이 정의할 수 있습니다.
| 파라미터 | 설명 |
|---|---|
| 일반적인 E-mail 형식의 값 | |
| hash | Bcrypt 알고리즘으로 암호화 된 사용자 암호 값이며 Bcrypt 알고리즘으로 생성된 Hash 값을 직접 입력
|
| username | 사용자 이름
|
| userID | 유일하게 식별될 수 있는 ID 값
|
kubectl을 사용할 수 있는 노드에서 다음 명령어를 이용해 dex configmap의 수정 화면으로 진입합니다.
kubectl edit configmap dex -n authkubectl edit configmap dex -n authstaticPasswords:
- email: admin@kubeflow.org
hash: $2y$10$Yb9WVbn8pzVSM6fBgKdFae1Bh6Z.XTihi7bNu3sB6/h5bt1JuUOgq
username: admin
userID: 9cb67307-fd6d-4441-9b59-52acd78f4c9e
- email: sds@samsung.com
hash: $2y$12$0g5.y86jnrt0v6In5NRCZ.YVuvrAUQ6j/RJYO3rV.kNulaDALOKfq
username: sds
userID: 8961d517-3498-4148-90c9-7e442ee91154staticPasswords:
- email: admin@kubeflow.org
hash: $2y$10$Yb9WVbn8pzVSM6fBgKdFae1Bh6Z.XTihi7bNu3sB6/h5bt1JuUOgq
username: admin
userID: 9cb67307-fd6d-4441-9b59-52acd78f4c9e
- email: sds@samsung.com
hash: $2y$12$0g5.y86jnrt0v6In5NRCZ.YVuvrAUQ6j/RJYO3rV.kNulaDALOKfq
username: sds
userID: 8961d517-3498-4148-90c9-7e442ee91154configmap의 staticPasswords 값은 Dex 서비스가 기동되는 시점에 반영되기 때문에 Dex 서비스를 다음 명령어로 재기동합니다.
kubectl rollout restart deployment dex -n authkubectl rollout restart deployment dex -n auth신규 사용자 정보를 이용해 로그인을 시도합니다
정상적으로 로그인 되어 새로운 Namespace(profile)을 생성하는 화면으로 전환되는것을 확인합니다.
위 내용은 Kubeflow 공식 사이트를 참고하여 작성하였습니다. 자세한 내용은 Kubeflow Profiles 참고하세요.
Kubeflow Jupyter Notebook의 Custom Image 활용방법
Kubeflow의 Notebook Life Cycle을 관리하는 Kubeflow Notebook Controller에서 Custom Image를 사용하기 위해서는 몇 가지 요구사항을 만족해야 합니다.
Kubeflow는 Notebook 이미지가 실행되면 Jupyter가 자동으로 시작되는 것으로 인식합니다. 그래서 컨테이너 이미지에 Jupyter를 시작하는 기본 명령을 설정해야 합니다.
다음은 Dockerfile에 포함해야 하는 내용의 예시입니다.
ENV NB_PREFIX /
CMD ["sh","-c", "jupyter notebook --notebook-dir=/home/${NB_USER} --ip=0.0.0.0 --no-browser --allow-root --port=8888 --NotebookApp.token='' --NotebookApp.password='' --NotebookApp.allow_origin='*' --NotebookApp.base_url=${NB_PREFIX}"]ENV NB_PREFIX /
CMD ["sh","-c", "jupyter notebook --notebook-dir=/home/${NB_USER} --ip=0.0.0.0 --no-browser --allow-root --port=8888 --NotebookApp.token='' --NotebookApp.password='' --NotebookApp.allow_origin='*' --NotebookApp.base_url=${NB_PREFIX}"]위 항목을 설명하면 아래와 같습니다.
| 파라미터 | 설명 |
|---|---|
--notebook-dir=/home/jovyan | 작업 디렉토리 설정
|
--ip=0.0.0.0 | Jupyter Notebook이 모든 IP에서 수신하도록 허용 |
--allow-root | Jupyter Notebook을 사용자가 root로 실행하도록 허용 |
--port=8888 | Port 설정 |
--NotebookApp.token=’’ –NotebookApp.password=’’ | Jupyter 인증 비활성화
|
--NotebookApp.allow_origin=’*’ | Allow origin |
--NotebookApp.base_url=NB_PREFIX | Base URL 설정 |
Custom Image 생성은 tesorflow notebook image를 생성하는 Dockerfile을 참고하여 생성할 수 있습니다.
- https://github.com/kubeflow/kubeflow/blob/v1.2.0/components/tensorflow-notebook-image/Dockerfile 참고하세요.
Notebook Servers 페이지에서 +NEW SERVER 버튼을 클릭하세요.
일단 Custom Image를 생성했다면 kubeflow Notebook Server 화면에서 Custom Image를 체크하고, Custom Image의 주소 를 입력하여 새로운 Notebook Server를 생성합니다.
위 내용은 Kubeflow 공식 사이트를 참고하여 작성하였습니다.
- 자세한 내용은 Kubeflow 공식 사이트의 Kubeflow Notebooks > Container Images 문서를 확인하세요.







