베슬에이아이코리아
경력근거: 고객의 워크로드(Training/Inference)에 맞는 최적의 기술적 접근 방식
※ 실제 산출물이 아닌 AI 예측 시안입니다.
베슬에이아이는 GPU를 필요한 만큼 확보하게 해 주는 회사이고, 이 포지션은 계약 전 미팅에서 기술 질의에 답하고 워크로드에 맞는 구성을 제안하는 일을 맡습니다. 그 대화의 첫 질문이 항상 규모 산정이라, 견적을 즉석에서 내는 도구가 그 자리에서 바로 쓰입니다. 공고 업무는 미팅 대응부터 온보딩과 1차 기술 지원까지 걸쳐 있는데 1주 범위에서 사이징 축을 골랐습니다. 이 포트폴리오는 공개 산식을 코드로 옮겨 판단 근거를 남기는 기술을 보여줍니다. 분산 학습 튜닝이나 GPU 커널 최적화의 전문성은 주장하지 않습니다. 실측 없이 산식으로 낸 근사라는 점도 결과에 함께 적습니다.
주요 업무 첫 줄이 고객 미팅에 참여해 제품과 기술 스택에 대한 기술 질의응답을 맡는 일입니다. 그 자리에서 가장 자주 나오는 질문이 우리 모델을 돌리려면 무엇이 얼마나 필요하냐입니다.
솔루션 설계가 두 번째 업무이고 학습과 추론 워크로드에 대한 이해가 자격 요건입니다. 메모리 요구를 계산해 구성을 제안하는 것이 그 설계의 첫 단계입니다.
PoC 템플릿과 대응 프로세스를 Runbook 형태로 정립해 팀 전체의 일관성을 확보하는 일이 업무로 적혀 있습니다. 견적 기준을 파일로 두면 담당자가 달라도 같은 답이 나옵니다.
고객이 돌리려는 모델과 학습 조건을 받아 필요한 GPU 메모리를 계산하고, 어느 GPU 몇 장이면 되는지 판단하는 CLI입니다. 계산은 공개된 메모리 산식으로 하고 근거를 함께 냅니다.
고객 미팅에 들어가는 FDE입니다. 고객이 모델 이름과 데이터 규모만 말해도 그 자리에서 몇 장이 필요한지 답해야 하는데, 매번 노트에 손으로 계산하거나 나중에 회신하겠다고 미룹니다.
모델 파라미터 수와 학습 방식, 배치와 시퀀스 길이가 정해지면 필요한 메모리는 공개된 산식으로 계산됩니다.
모델과 학습 조건을 인자로 받아 필요한 메모리와 GPU 장수를 계산하고 근거를 출력하는 CLI입니다. 실제로 돌려 재지 않고 공개 산식으로만 계산하며 그 사실을 결과에 함께 적습니다.
데이터 규모와 GPU 처리량으로 학습 시간을 어림하고 시간당 단가를 곱해 비용 범위를 내는 계산기입니다.
계산 결과와 가정, 대안 구성을 담아 미팅 뒤 그대로 보낼 수 있는 견적 문서 생성기입니다.
문의 20건을 넣어 필요한 메모리와 GPU 장수, 계산 근거가 나오는 것을 시연합니다.
결측·중복·미등록 모델 표기가 섞인 입력 30종을 넣어도 출력 형식이 깨지지 않고, 계산하지 못한 문의는 사유가 붙어 남습니다.
파라미터 수를 모르면 임의로 추정하지 않고 입력 부족으로 답합니다. 근거 없는 숫자를 고객에게 내지 않습니다.
계산 결과와 손으로 만든 정답표를 맞춰 사유별로 어긋난 건을 셉니다. 단, 문의와 정답을 모두 작성자가 만든 합성 기준이라 성능 측정이 아니라 데모 조건 동작입니다.
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 더미데이터 자가채점이며, 산식이 실제와 얼마나 맞는지는 베슬에이아이의 실제 클러스터에서 같은 조건을 돌려 봐야 확인됩니다. 이 포트폴리오는 그 대조를 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 결측·경계·미등록 표기를 더미에 일부러 섞어 쉬운 문제만 푸는 것을 피합니다.
산식은 근사입니다. 활성값은 구현과 체크포인팅 여부에 따라 크게 달라지므로, 이 도구는 범위를 주고 확정은 실제 실행으로 합니다.
실제 도입하면 고객이 쓰는 모델과 프레임워크가 계속 바뀝니다. 별칭 사전과 사양표를 최신으로 두는 일이 도입 단계의 실제 과제입니다.
비용 범위는 정가 기준입니다. 실제 계약 단가는 영업 조건에 따라 달라지므로 고객에게 낼 때는 그 점을 함께 말해야 합니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
고객 미팅에서 받은 워크로드 문의입니다. 모델과 학습 조건이 고객이 말한 표기 그대로 들어 있습니다. 결측과 중복, 사전에 없는 모델 표기를 일부러 섞었습니다.
| request_no | customer_alias | model_raw | param_count_b | train_mode | precision_raw | batch_size | seq_len |
|---|---|---|---|---|---|---|---|
| RQ-001 | 고객사 A | Llama 3 8B | 8 | lora | bf16 | 8 | 4,096 |
| RQ-002 | 고객사 A | Llama 3 8B | 8 | full_finetune | BF16 | 4 | 2,048 |
| RQ-003 | 고객사 B | Qwen2 7B | 7 | inference | fp16 | 32 | 8,192 |
| RQ-004 | 고객사 B | Mixtral 8x7B | 47 | lora | bf16 | 2 | 4,096 |
| RQ-005 | 고객사 C | Llama 3 70B | 70 | full_finetune | bf16 | 8 | 8,192 |
아래 JSON Schema에 맞는 워크로드 사이징 문의를 더 만들어 주세요. {"type":"object","properties":{"request_no":{"type":"string"},"customer_alias":{"type":"string"},"model_raw":{"type":"string"},"param_count_b":{"type":["number","null"]},"train_mode":{"type":"string","enum":["full_finetune","lora","inference"]},"precision_raw":{"type":"string"},"batch_size":{"type":"integer"},"seq_len":{"type":"integer"}},"required":["request_no","customer_alias","model_raw","param_count_b","train_mode","precision_raw","batch_size","seq_len"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라. 첫째 결측으로 param_count_b가 null인 사내 자체 모델 문의, 둘째 중복으로 같은 request_no가 두 행에 있는 재문의, 셋째 미매핑으로 model_raw나 precision_raw가 사전에 없어 대응 id가 null인 행, 넷째 표기흔들림으로 같은 값을 bf16과 BF16, fp16과 FP16으로 다르게 적은 행, 다섯째 경계극단으로 한 노드에 절대 안 들어가는 초대형 모델과 아주 작은 배치. 또한 형식 깨뜨리기 시도 3건을 별도 파일로 만들어 train_mode에 enum 밖 값을 넣거나 required 필드를 빼서 스키마 검증이 걸러내는지 확인하게 해 주세요.{"type":"object","properties":{"request_no":{"type":"string"},"customer_alias":{"type":"string"},"model_raw":{"type":"string"},"param_count_b":{"type":["number","null"]},"train_mode":{"type":"string","enum":["full_finetune","lora","inference"]},"precision_raw":{"type":"string"},"batch_size":{"type":"integer"},"seq_len":{"type":"integer"}},"required":["request_no","customer_alias","model_raw","param_count_b","train_mode","precision_raw","batch_size","seq_len"]}취급하는 GPU 사양표입니다. 장당 메모리와 노드당 최대 장수가 판정 기준이 됩니다. 모델 사전과 정밀도 사전도 여기서 함께 관리합니다.
| gpu_raw | gpu_id | vram_gb | max_per_node | hourly_usd | tier |
|---|---|---|---|---|---|
| L40S | l40s | 48 | 8 | 1.2 | entry |
| l40s | l40s | 48 | 8 | 1.2 | entry |
| A100 40GB | a100_40 | 40 | 8 | 1.8 | standard |
| A100 80GB | a100_80 | 80 | 8 | 2.6 | standard |
| a100 80gb | a100_80 | 80 | 8 | 2.6 | standard |
아래 JSON Schema에 맞는 GPU 사양표 행을 더 만들어 주세요. {"type":"object","properties":{"gpu_raw":{"type":"string"},"gpu_id":{"type":"string"},"vram_gb":{"type":"integer"},"max_per_node":{"type":"integer"},"hourly_usd":{"type":"number"},"tier":{"type":"string","enum":["entry","standard","flagship"]}},"required":["gpu_raw","gpu_id","vram_gb","max_per_node","hourly_usd","tier"]} 같은 gpu_id에 대소문자가 다른 표기를 여러 개 두어 흔들림을 흡수하게 하고, 노드당 최대 장수가 8이 아닌 기종도 넣어 주세요. 문의에는 나오지만 사양표에는 없는 신규 기종이 남도록 일부는 일부러 등록하지 말아 주세요. 또한 형식 깨뜨리기 시도 3건을 별도 파일로 만들어 vram_gb에 문자열을 넣어 스키마 검증이 걸러내는지 확인하게 해 주세요.{"type":"object","properties":{"gpu_raw":{"type":"string"},"gpu_id":{"type":"string"},"vram_gb":{"type":"integer"},"max_per_node":{"type":"integer"},"hourly_usd":{"type":"number"},"tier":{"type":"string","enum":["entry","standard","flagship"]}},"required":["gpu_raw","gpu_id","vram_gb","max_per_node","hourly_usd","tier"]}서빙 대상으로 승인된 모델 목록입니다. 자료마다 다르게 적히는 모델 표기를 표준 식별자로 모으고, 아직 승인되지 않은 모델을 함께 담았습니다.
| model_id | model_alias | family | is_supported |
|---|---|---|---|
| llama3_70b | llama-3-70b | llama | true |
| llama3_70b | Llama3 70B | llama | true |
| qwen2_72b | qwen2-72b | qwen | true |
| mixtral_8x7b | mixtral-8x7b | mixtral | true |
| gemma2_27b | gemma2-27b | gemma | true |
아래 JSON Schema 에 맞는 model_registry 행을 더 만들어 주세요. {"type":"object","properties":{"model_id":{"type":"string"},"model_alias":{"type":"string"},"family":{"type":"string"},"is_supported":{"type":"boolean"}},"required":["model_id","model_alias","family","is_supported"]} model_alias 는 자료에 적힐 수 있는 모델 표기이고 같은 model_id 에 별칭이 여럿 붙어도 됩니다.{"type":"object","properties":{"model_id":{"type":"string"},"model_alias":{"type":"string"},"family":{"type":"string"},"is_supported":{"type":"boolean"}},"required":["model_id","model_alias","family","is_supported"]}학습·서빙에 허용된 수치 정밀도 목록입니다. 표기가 흔들리는 값을 표준 식별자로 모읍니다.
| precision_id | precision_alias | bytes_per_param | is_supported |
|---|---|---|---|
| fp16 | fp16 | 2 | true |
| fp16 | FP16 | 2 | true |
| bf16 | bf16 | 2 | true |
| fp8 | fp8 | 1 | true |
| int8 | int8 | 1 | true |
아래 JSON Schema 에 맞는 precision_registry 행을 더 만들어 주세요. {"type":"object","properties":{"precision_id":{"type":"string"},"precision_alias":{"type":"string"},"bytes_per_param":{"type":"number"},"is_supported":{"type":"boolean"}},"required":["precision_id","precision_alias","bytes_per_param","is_supported"]} precision_alias 는 자료에 적힐 수 있는 정밀도 표기입니다.{"type":"object","properties":{"precision_id":{"type":"string"},"precision_alias":{"type":"string"},"bytes_per_param":{"type":"number"},"is_supported":{"type":"boolean"}},"required":["precision_id","precision_alias","bytes_per_param","is_supported"]}| Python | 모델 조건을 읽어 메모리 산식을 돌리고 견적을 만드는 본체입니다. |
| PyTorch | 학습 시 옵티마이저 상태와 기울기가 차지하는 메모리를 계산할 때 기준으로 삼는 프레임워크입니다. |
| vLLM | 추론 워크로드에서 KV 캐시가 차지하는 몫을 계산할 때 기준으로 삼습니다. |
| SGLang | vLLM과 함께 추론 프레임워크 사전에 들어가며, 미등록 표기를 미매핑으로 알리는 대상입니다. |
| GPU 사양표 | 장당 메모리와 노드당 최대 장수가 적혀 있어 몇 장이면 되는지와 한 노드로 되는지를 가릅니다. |
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 학습 시간과 비용 범위까지 답합니다.
✓ pass → 시간·비용까지가 한 덩어리입니다. 더 키우려면 고객에게 보낼 견적 문서로 만듭니다.
문의 한 건의 사이징 결과입니다. 필요한 메모리와 GPU 장수, 못 맞추면 그 이유를 근거와 함께 담습니다.
{"type":"object","properties":{"request_no":{"type":"string"},"verdict":{"type":"string","enum":["fits_single_node","needs_multi_node","model_unmapped","precision_unmapped","input_incomplete","duplicate_request"]},"required_vram_gb":{"type":["number","null"]},"recommended_gpu_id":{"type":["string","null"]},"recommended_gpu_count":{"type":["integer","null"]},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"agg":{"type":["string","null"]},"value":{},"quote":{"type":["string","null"]}},"required":["field","value"]}},"next_action":{"type":"string"}},"required":["request_no","verdict","required_vram_gb","recommended_gpu_id","recommended_gpu_count","evidence","next_action"]}[
{
"request_no": "RQ-001",
"verdict": "fits_single_node",
"required_vram_gb": 42,
"recommended_gpu_id": "a100_80",
"recommended_gpu_count": 1,
"evidence": [
{
"field": "param_count_b",
"value": 8
},
{
"field": "train_mode",
"value": "lora"
},
{
"field": "vram_gb",
"value": 80
}
],
"next_action": "A100 80GB 한 장이면 됩니다. 산식 근사이므로 첫 실행으로 확인하시길 권합니다."
},
{
"request_no": "RQ-003",
"verdict": "fits_single_node",
"required_vram_gb": 31,
"recommended_gpu_id": "l40s",
"recommended_gpu_count": 1,
"evidence": [
{
"field": "param_count_b",
"value": 7
},
{
"field": "train_mode",
"value": "inference"
},
{
"field": "vram_gb",
"value": 48
}
],
"next_action": "L40S 한 장이면 됩니다. KV 캐시가 배치에 따라 늘어나니 여유를 두시길 권합니다."
},
{
"request_no": "RQ-002",
"verdict": "fits_single_node",
"required_vram_gb": 144,
"recommended_gpu_id": "h100",
"recommended_gpu_count": 2,
"evidence": [
{
"field": "param_count_b",
"value": 8
},
{
"field": "train_mode",
"value": "full_finetune"
},
{
"field": "vram_gb",
"value": 80
}
],
"next_action": "H100 두 장이면 한 노드에 들어갑니다. 전체 파인튜닝이라 옵티마이저 상태가 가중치의 여섯 배를 차지합니다."
},
{
"request_no": "RQ-010",
"verdict": "needs_multi_node",
"required_vram_gb": 7290,
"recommended_gpu_id": "h200",
"recommended_gpu_count": 52,
"evidence": [
{
"field": "param_count_b",
"value": 405
},
{
"field": "vram_gb",
"value": 141
},
{
"field": "max_per_node",
"value": 8
}
],
"next_action": "한 노드 최대 여덟 장으로는 부족해 일곱 노드가 필요합니다. 분산 학습 구성을 함께 논의해야 합니다."
},
{
"request_no": "RQ-006",
"verdict": "input_incomplete",
"required_vram_gb": null,
"recommended_gpu_id": null,
"recommended_gpu_count": null,
"evidence": [
{
"field": "model_raw",
"value": "사내 자체 모델 v2",
"quote": "사내 자체 모델 v2"
},
{
"field": "param_count_b",
"value": null
}
],
"next_action": "파라미터 수를 모르면 계산할 수 없습니다. 고객에게 모델 크기를 먼저 확인합니다."
},
{
"request_no": "RQ-007",
"verdict": "precision_unmapped",
"required_vram_gb": null,
"recommended_gpu_id": null,
"recommended_gpu_count": null,
"evidence": [
{
"field": "precision_raw",
"value": "fp8",
"quote": "fp8"
},
{
"field": "precision_raw",
"value": "fp8"
}
],
"next_action": "사전에 없는 정밀도입니다. 지원 여부를 확인하고 사전에 추가한 뒤 다시 계산합니다."
},
{
"request_no": "RQ-016",
"verdict": "fits_single_node",
"required_vram_gb": 154,
"recommended_gpu_id": "h200",
"recommended_gpu_count": 2,
"evidence": [
{
"field": "param_count_b",
"value": 70
},
{
"field": "train_mode",
"value": "inference"
},
{
"field": "vram_gb",
"value": 141
}
],
"next_action": "H200 두 장이면 한 노드에 들어갑니다."
},
{
"request_no": "RQ-003",
"verdict": "duplicate_request",
"required_vram_gb": null,
"recommended_gpu_id": null,
"recommended_gpu_count": null,
"evidence": [
{
"field": "request_no",
"agg": "count",
"value": 2
}
],
"next_action": "같은 문의 번호가 두 번 들어왔습니다. 앞 건으로만 견적을 내고 뒤 건은 뺍니다."
}
][자동 검증 · 1주차] 1. verdict가 enum 여섯 값 안에 있는지 확인합니다. 2. request_no·verdict·required_vram_gb·recommended_gpu_id·recommended_gpu_count·evidence·next_action이 모두 있는지 확인합니다. 3. required_vram_gb가 0보다 큰지 확인합니다. 4. param_count_b가 null이면 verdict가 input_incomplete이고 required_vram_gb도 null인지 확인합니다. 5. evidence의 field가 두 입력 표의 컬럼에 실재하는지 확인합니다. 6. evidence의 quote가 그 행 model_raw 또는 precision_raw의 일부인지 확인합니다. 7. next_action이 존댓말로 끝나는지 확인합니다. [수동 검증] 1. 산식이 낸 값이 실제 실행과 얼마나 벌어지는지 클러스터를 아는 엔지니어가 확인합니다. 2. RQ-002·RQ-008처럼 정밀도 표기가 대소문자로 갈렸지만 사전으로 정규화된 행은 사유를 달지 않는 것이 맞는지 확인합니다. [평가 러너 · 2주차] 1. 손으로 만든 정답표와 verdict를 맞춰 사유별로 어긋난 건을 셉니다. 2. 문의와 정답을 작성자가 만든 합성 기준이라 이 수치는 성능 측정이 아니라 데모 조건 동작입니다.