컨테이너 안 경로와 환경 변수
플랫폼이 학습 컨테이너에 넣어 주는 디렉터리, manifest.json, 환경 변수, experiment.json
GEO_* 환경 변수와 /geo/… 경로는 플랫폼이 실제로 넣어 주는 이름 그대로입니다.
디렉터리
/geo ├── dataset/ # GEO_DATA_DIR: 데이터셋 원본, 읽기 전용. 학습 시작 전에 전부 놓여 있다 │ ├── manifest.json # 파일 목록 · 종류 · 메타 │ ├── images/ # kind 별 하위 디렉터리 (image) │ ├── annotations/ # (annotation) │ ├── timeseries/ # (timeseries) │ ├── tabular/ # (tabular) │ ├── pointclouds/ # (pointcloud) │ └── other/ # 그 밖 ├── work/ # GEO_WORK_DIR: 쓰기 가능한 작업 공간. 실행이 끝나면 사라진다 └── experiment.json # GEO_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 기준 상대 경로이므로 그대로 이어 붙여 엽니다.
{
"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중 하나이고, 놓이는 하위 디렉터리와 짝을 이룹니다.- 업로드 때 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_TASK | 태스크(예: object_detection) |
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) |
CUDA_VISIBLE_DEVICES | GPU 마스킹. GPU 가 없으면 빈 값 |
MLFLOW_TRACKING_URI | 플랫폼 MLflow 주소 |
MLFLOW_TRACKING_TOKEN | 실행마다 발급되고 끝나면 회수되는 토큰. 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()함수 참고). - 들어오지 않는 것: 오브젝트 스토리지 주소·키. 데이터는 플랫폼이 미리 받아 두므로 학습 컨테이너에는 스토리지 자격 증명이 가지 않습니다.
PYTHONUNBUFFERED는 플랫폼이 넣지 않습니다. 로그를 실시간으로 보려면 Dockerfile 에ENV PYTHONUNBUFFERED=1을 넣으세요.
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" },
"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 확인용(참고) |