# git clone https://github.com/OSSS-KU/ecoGPU
# cd ecoGPU
# docker build -t ecogpu:latest .
# docker run --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 -v .:/workspace --gpus all -d --name api-server -p 8000:8000 ecogpu:latest
EcoGPU API는 두 개의 JSON 입력 파일을 받아 학습 시간·비용·GPU 사용량을 예측합니다. 첫째는 클러스터 관리자가 입력하는 cluster.json이고, 둘째는 사용자가 요청과 함께 body에 담아 보내는 worklaod.json입니다.
GPU 클러스터 관련 정보를 포함합니다.
| 필드 | 의미 | 입력 예시 | 주의사항 |
|---|---|---|---|
gpu_counts |
키: "GPU-이름-메모리"값: 해당 GPU 총 개수 |
"A100-40GB": 4, "H100-80GB": 8 |
여러 종류 동시 기재 가능. /opt 엔드포인트는 첫 번째 키를 기본 사용 |
bandwidth_gb_per_s |
노드 간 평균 통신 대역폭 (GB/s). DP/TP Ring All-Reduce에 사용 | 478.116 |
단일 값으로 간주하므로 다중 노드·비대칭 망은 아직 지원하지 않음 |
| GPU 이름 규칙 | …-<n>GB 형식이어야 메모리 예측기가 용량을 파싱 가능 |
H100-80GB, A100-40GB |
정규식 (\d+)GB 로 숫자를 추출하므로 뒤에 반드시 GB가 붙어야 함 |
예측할 워크로드 관련 정보를 포함합니다.
| 필드 | 의미 | 제약/권장값 |
|---|---|---|
model_name |
모델 이름. | 소문자 권장 (llama, vits 등) |
data_parallel_size |
Data Parallel size | |
tensor_parallel_size |
Tensor Parallel size | |
pipeline_parallel_size |
Pipeline Parallel size | |
vocab_size |
vocab 크기 (v) | 양의 정수 |
attention_heads |
전체 어텐션 헤드 수 (a) | 양의 정수 |
key-value_heads |
KV 헤드 수(GQA용) (k) | k <= attention_heads |
total_num_parameters |
전체 파라미터 개수 | 양의 정수 |
num_transformer_layers |
레이어 수 (L) | 양의 정수 |
hidden_size |
hidden 차원 (h) | 양의 정수 |
sequence_length |
시퀀스 길이 (s) | 양의 정수 |
batch_size |
글로벌 배치 크기 (B) | B % microbatch_size == 0 |
microbatch_size |
마이크로배치 크기 (b) | 1·2·4·8 (새값은 ops_db에 반영 필요) |
FFN_hidden_size |
FFN hidden 크기 (h_{ffn}) | 양의 정수 |
Note (dp * tp * pp)는 구동할 총 GPU 수 라는 점에 유의해야 합니다.
이 프로젝트는 딥러닝 모델을 구성하는 다양한 연산자(Operator)에 대해 PyTorch 기반 벤치마크를 수행하여, 연산별 실행 시간을 측정합니다.
측정 결과는 GPU별로 ops_db/perf_{GPUNAME}.csv 파일에 저장되며, 학습 시간 예측에 활용됩니다.
-
벤치마크 스크립트 실행
python ops_db/op_benchmark.py
- 실행 시 현재 사용 가능한 GPU의 이름을 자동으로 감지하여, 결과를
ops_db/perf_{GPUNAME}.csv로 저장합니다. - 예시:
ops_db/perf_nvidia_a100-sxm4-40gb.csv
- 실행 시 현재 사용 가능한 GPU의 이름을 자동으로 감지하여, 결과를
-
벤치마크 대상 및 설정
- 주요 PyTorch 연산자(ONNX 연산자와 매핑)별로 벤치마크를 수행합니다.
- 다음과 같은 다양한 조합에 대해 반복 측정합니다:
- Batch size: 1, 2, 4, 8, 16
- Sequence length: 512, 1024, 2048
- Precision: fp32, fp16, mixed
- 각 조합별로 연산자의 Forward/Backward 평균 실행 시간을 측정합니다.
-
결과 파일 구조
-
결과는 CSV 파일로 저장되며, 주요 컬럼은 다음과 같습니다:
Opname precision bs seq_len hidden FWD_time BWD_time TOT_time Add fp32 1 512 4096 0.123 0.456 0.579 ... ... ... ... ... ... ... ... -
각 행은 하나의 연산자, 하나의 설정(batch size, seq_len, precision 등)에 대한 측정 결과를 나타냅니다.
-
TOT_time은 Forward와 Backward의 합산(ms)입니다. Backward가 없는 연산자는 0으로 기록됩니다.
-
-
예측에서의 활용
- 학습 시간 예측기는 현재 구동 중인 GPU의 이름에 맞는 CSV 파일을 자동으로 선택하여,
입력된 batch size에 맞는 연산자별 실행 시간을 집계합니다. - 새로운 batch size나 연산자 조합을 추가하려면, 반드시 벤치마크를 다시 실행하여 CSV를 갱신해야 합니다.
- 학습 시간 예측기는 현재 구동 중인 GPU의 이름에 맞는 CSV 파일을 자동으로 선택하여,
이 프로젝트를 구동하려면 모델 연산자 그래프가 필요합니다. 현재 구현은 ONNX(Open Neural Network Exchange) 형식의 모델을 사용합니다.
ONNX 모델 파일(예: llama.onnx, vits.onnx)은 프로젝트의 models/ 디렉토리 내에 위치시켜야 합니다.
VITS, LLaMA 3.1-8B, LLaVA ONNX 모델은 다음 링크에서 다운로드할 수 있습니다:
임의 파이토치 모델을 ONNX 모델 파일 형식으로 Export하는 것도 가능합니다(다음 링크 참고).
- https://docs.pytorch.org/docs/stable/onnx_torchscript.html#torch.onnx.export
- https://huggingface.co/docs/optimum/en/exporters/onnx/usage_guides/export_a_model
| 엔드포인트 | HTTP 메서드 | 설명 | 요청 본문 | 응답 (JSON) |
|---|---|---|---|---|
/status |
GET |
예측 가능 여부 확인 | 없음 | 요청 성공:{"status": "ok"}요청 실패: {"error": "오류 메시지"} |
/predict |
POST |
학습 시간 예측 | workload.json |
요청 성공:{"training_time_per_iteration":123.456,"total_training_time":1234.56,"iteration_count":10,"cost":12345.6요청 실패: {"error": "오류 메시지"} |
/opt |
POST |
최적의 GPU 기종/개수/가격 예측 | workload.json |
요청 성공:{"gpu": "H100-80GB", "dp": 2, "tp": 1, "pp": 2, "training_time": 780.87, "cost": 584.04}best_result_{GPUNAME}.json 결과 파일 생성요청 실패: {"error": "오류 메시지"} |
/lowest |
POST |
OOM 미발생 구성 중 가장 짧은 시간이 소요되는 구성 예측 | workload.json |
요청 성공:{"lowest_value": 50.0, "corresponding_config": {"dp": 2, "tp": 4, "pp": 1}}upper_bound.json 결과 파일 생성요청 실패: {"error": "오류 메시지"} |
/highest |
POST |
가용 GPU 자원 중 가장 오랜 시간이 소요되는 구성 예측 | workload.json |
요청 성공:{"highest_value": 200.0, "corresponding_config": {"dp": 1, "tp": 1, "pp": 8}}lower_bound.json 결과 파일 생성요청 실패: {"error": "오류 메시지"} |
/stop |
POST |
실행 중인 예측/최적화 job 강제 종료 | 없음 | 요청 성공:{"status": "stopped"}실행 중 job 없음: {"status": "no running job"} |
사용 예시
# curl -i -X GET http://localhost:8000/status
# curl -i -X POST http://localhost:8000/predict -H "Content-Type: application/json" -d "@./configs/workload.json"
# curl -i -X POST http://localhost:8000/opt -H "Content-Type: application/json" -d "@./configs/workload.json"
# curl -i -X POST http://localhost:8000/lowest -H "Content-Type: application/json" -d "@./configs/workload.json"
# curl -i -X POST http://localhost:8000/highest -H "Content-Type: application/json" -d "@./configs/workload.json"
# curl -i -X POST http://localhost:8000/stop
https://github.com/OSSS-KU/ecoGPU/graphs/contributors
