컨테이너 내부 경로와 환경 변수
플랫폼이 학습 컨테이너에 제공하는 디렉터리, manifest.json, 환경 변수, experiment.json
GEO_* 환경 변수와 /geo/… 경로는 플랫폼이 주입하는 이름 그대로.
디렉터리
/geodataset/GEO_DATA_DIR: 데이터셋 원본, 읽기 전용. 학습 시작 전에 모든 파일이 배치된다manifest.json파일 목록 · 종류 · 메타images/kind 별 하위 디렉터리 (image)annotations/(annotation)timeseries/(timeseries)tabular/(tabular)pointclouds/(pointcloud)work/GEO_WORK_DIR: 쓰기 가능한 작업 공간. 실행이 끝나면 삭제된다experiment.jsonGEO_CONFIG: 실험 설정 스냅샷 (고급)| 경로 | 환경 변수 | 내용 |
|---|---|---|
/geo/dataset | GEO_DATA_DIR | 데이터셋 파일 원본(읽기 전용). 여러 실행이 같은 캐시를 재사용하므로 여기에 쓰지 않음. |
/geo/work | GEO_WORK_DIR | 체크포인트 · 변환한 라벨 · 중간 산출물. 파드와 함께 삭제. |
/geo/experiment.json | GEO_CONFIG | 설정 전체 스냅샷. 환경 변수로 부족할 때만 읽음. |
manifest.json
위치: GEO_DATA_DIR 바로 아래. path 는 GEO_DATA_DIR 기준 상대 경로이므로 GEO_DATA_DIR 과 결합해 사용.
{
"dataset": { "id": "ds-…", "name": "…" },
"files": [
{ "path": "images/site_008.jpg", "kind": "image",
"meta": { "width": 640, "height": 480, "format": "JPEG",
"label_files": [{ "filename": "site_008.json", "format": "labelme" }] } },
{ "path": "annotations/site_008.json", "kind": "annotation",
"meta": { "format": "labelme", "annotation_count": 2, "match_rate": 1.0 } },
{ "path": "tabular/features.csv", "kind": "tabular",
"meta": { "row_count": 300, "columns": [{ "name": "label", "dtype": "object" }] } }
]
}
kind는image·annotation·timeseries·tabular·pointcloud중 하나, 저장되는 하위 디렉터리와 대응. 검증을 통과한 파일만 저장.- 디렉터리에는 플랫폼이 캐시 확인에 사용하는 숨김 파일(
.stamp)도 있음. 파일 목록은 디렉터리를 탐색하지 말고manifest.json에서 읽음. - 업로드 시 zip 내부의 폴더 구조는 평탄화. 같은 이름이 중복되면 이름 뒤에
-2가 붙음. 클래스별 하위 폴더 같은 구조에 의존 금지. meta는 플랫폼 검증기가 채운 값(이미지 크기와 짝지어진 라벨 파일, 어노테이션 형식, 표의 행 수·컬럼 등). 예시는 축약본이며, 키가 더 있을 수 있음.- 라벨 형식은 종류마다 다름. 이미지 계열은 어노테이션 파일(COCO JSON · LabelMe JSON · VOC XML)로,
tabular은 CSV 내부의 컬럼으로, 포인트클라우드는 PLY 파일 내부의 정수 속성으로 제공. timeseries와tabular은 같은.csv/.parquet사용. 데이터셋 생성 시 선택한 모달리티로 둘을 구분.tabular의meta에는time_column키 없음.- train/val 분할은 트레이너가 수행. 플랫폼은 파일을 분할하지 않고,
experiment.json의split에 비율과 시드만 기록.
환경 변수
| 변수 | 내용 |
|---|---|
GEO_DATA_DIR | 데이터셋 디렉터리(/geo/dataset) |
GEO_WORK_DIR | 작업 공간(/geo/work) |
GEO_CONFIG | 실험 설정 파일(/geo/experiment.json) |
GEO_PARAM_EXPERIMENT_ID | 학습 실행 ID(experiment.json 의 experiment_id) |
GEO_PARAM_EXPERIMENT_NAME | 실험 이름(= MLflow 실험 이름) |
GEO_PARAM_TASK | 태스크(예: object_detection) |
GEO_PARAM_FRAMEWORK | 마법사 2단계에서 선택한 프레임워크(예: yolo) |
GEO_PARAM_MODEL | 모델 변형(예: yolo26n) |
GEO_PARAM_DATASET_ID | 데이터셋 ID |
GEO_PARAM_DEVICE | 0 또는 cpu. 파드 내부에서 GPU 는 항상 0번부터 인식. |
GEO_HP_<이름> | 마법사에서 지정한 하이퍼파라미터(예: GEO_HP_EPOCHS=50, GEO_HP_LR=0.001) |
GEO_RUNTIME_IMAGE | 이 학습을 실행한 이미지 주소. digest 로 고정된 주소일 수 있음. |
CUDA_VISIBLE_DEVICES | GPU 를 1개 이상 할당받으면 0, 없으면 빈 값. 슬롯을 여러 개 할당받아도 0번 하나만 인식. |
MLFLOW_TRACKING_URI | 플랫폼 MLflow 주소 |
MLFLOW_TRACKING_TOKEN | 실행마다 발급되고 실행 종료 시 회수되는 토큰. MLflow 클라이언트가 자동으로 읽음. MLflow 인증을 비활성화한 배포에서는 전달되지 않음. |
MLFLOW_EXPERIMENT_NAME | 플랫폼이 미리 만든 실험 이름. 이 값을 그대로 사용. |
MLFLOW_RUN_ID | 플랫폼이 미리 만든 run. mlflow.start_run() 이 이 run 에 연결. |
GEO_HP_*이름 규칙: 하이퍼파라미터 키는^[a-z][a-z0-9_]*$만 허용, 환경 변수 이름은 그 키를 그대로 대문자로 변환한 것(lr→GEO_HP_LR). 중첩 구조나 리스트는 환경 변수로 표현할 수 없어experiment.json에만 포함.- 값은 모두 문자열. 기본값의 타입으로 변환해 읽음(예제의
hyperparameter()함수 참고). 참거짓은 소문자true/false로 전달. 파이썬의bool("false")는 참이므로 문자열을 직접 비교. - 마법사 7단계 YAML 에 있는 키만 전달. 키는 선택한 프레임워크의 허용 목록으로 제출 시 검사되므로, 카탈로그에 없는 키는 전달 불가. YAML 을 비워 제출하면
GEO_HP_*가 하나도 없으므로 모든 값에 이미지 측 기본값 지정. - 전달되지 않는 것: 오브젝트 스토리지 주소·키. 데이터는 플랫폼이 미리 내려받으므로 학습 컨테이너에는 스토리지 자격 증명 없음.
PYTHONUNBUFFERED는 플랫폼이 설정하지 않음. 로그를 실시간으로 보려면 Dockerfile 에ENV PYTHONUNBUFFERED=1추가 필요.
자원 한도
| 항목 | 기본값 | 초과하면 |
|---|---|---|
| 메모리 | 학습 컨테이너 상한 64Gi(서버 설정 GEO_MLOPS_TRAINING_RUNTIME_MEMORY_LIMIT). /dev/shm 도 이 상한에 포함. | 파드가 종료 코드 137 로 종료되고 학습 실패 |
/dev/shm | 2Gi(서버 설정 GEO_MLOPS_TRAINING_RUNTIME_SHM_SIZE) | DataLoader 워커 수나 배치가 크면 부족할 수 있음. 운영자에게 크기 확대 요청. |
| GPU | 마법사 10단계에서 선택한 슬롯 수. 0 이면 CPU. | GPU 전용 프레임워크는 0 이면 제출 거절 |
experiment.json (고급)
주요 값은 환경 변수로도 전달되므로 대부분의 이미지는 이 파일을 읽지 않음. classes 목록, split 비율, 중첩된 하이퍼파라미터가 필요할 때만 읽음. 자격 증명은 이 파일에 없으므로 로그로 남겨도 안전.
{
"experiment_id": "7abfb12e3a8d…",
"name": "mnist-external-smoke-3",
"tenant": "DEMO",
"created_at": "2026-09-21T06:59:47Z",
"task": "object_detection",
"framework": "yolo",
"model": "yolo26n",
"classes": ["head", "helmet"],
"split": { "method": "random", "train_percent": 80, "seed": 0 },
"hyperparameters": { "epochs": 2 },
"device": "cpu",
"gpu": 0,
"evaluation": { "benchmark": true, "speed_test": false },
"export": { "onnx": false, "tensorrt": false },
"serving": { "runtime": "cpu" },
"register": { "enabled": false, "model_name": "" },
"pretrained": { "source": "catalog" },
"dataset": { "id": "ds-…", "name": "…", "file_count": 16,
"path": "/geo/dataset", "manifest": "/geo/dataset/manifest.json",
"pointcloud_labels": null },
"paths": { "data_dir": "/geo/dataset", "work_dir": "/geo/work" },
"mlflow": { "experiment_name": "mnist-external-smoke-3", "run_id": "…" }
}
| 묶음 | 뜻 |
|---|---|
experiment_id · name · tenant · created_at | 실행 식별 정보. name = MLflow 실험 이름. |
task · framework · model · classes | 학습 대상. classes 는 이번 실험에서 선택한 클래스만. |
split | 분할 지시. 분할 자체는 트레이너가 수행. |
hyperparameters | GEO_HP_* 와 같은 값의 파싱된 객체 |
device · gpu | 계산 자원 |
evaluation · export · serving | 학습 뒤 요청 사항. 지원하지 않으면 무시. |
register | 등록 여부와 모델 이름. 등록 자체는 플랫폼이 수행. |
pretrained | 시작 가중치의 출처. 사전학습 가중치 참고. |
dataset · paths · mlflow | 위치와 run 확인용(참고). dataset.pointcloud_labels 는 PLY 의 어느 속성이 클래스이고 어느 속성이 인스턴스 ID 인지 지정(포인트클라우드가 없으면 null). |