망고부스트코리아
경력근거: 고객 배포 설계 및 구축 (모델 선정, 처리량·지연 목표, GPU 사이징, 비용 산정 포함)
※ 실제 산출물이 아닌 AI 예측 시안입니다.
망고부스트는 LLM 추론 최적화 소프트웨어 LLMBoost 와 독자 설계한 DPU 를 쓰는 GPU·스토리지 시스템, 이를 통합해 제어하는 오케스트레이션 소프트웨어까지 AI 인프라의 모든 계층을 직접 설계하고 만드는 회사예요. LLMBoost 는 고객이 가진 GPU 서버나 고객의 클라우드에 설치해 오픈 웨이트 LLM 을 서빙하고, 대표는 설치 고객으로 온프레미스를 원하는 금융·국방과 하이퍼스케일러를 꼽았어요.
공고는 이 자리가 맡을 일로 '고객 배포 설계 및 구축 (모델 선정, 처리량·지연 목표, GPU 사이징, 비용 산정 포함)'을 꼽고, '가격과 성능을 보여 주는 데모, 레퍼런스 연동, 벤치마크 비교 자료 구축'도 할 일로 적었어요. 고객 한 곳이 돌리려는 워크로드는 여러 개일 수 있고, 워크로드마다 모델·동시 사용자 수·컨텍스트 길이·응답 속도 목표·예산이 달라요. 같은 모델이라도 동시 사용자 수와 컨텍스트 길이가 달라지면 같은 GPU 구성에서 나오는 응답 속도와 처리량이 달라져서, 다른 조건으로 잰 벤치마크 숫자를 그대로 견적에 옮기면 PoC 에서 목표와 어긋나요.
공고는 이 자리가 고객과 기술 검토와 PoC(개념 검증)를 진행하고, 고객 워크로드를 플랫폼의 알맞은 배포 형태에 매핑하는 일을 맡는다고 적었어요.
공고는 고객 배포 설계와 구축을 이 자리에 맡기면서, 그 안에 모델 선정, 처리량·지연 목표, GPU 사이징, 비용 산정이 들어간다고 적었어요. 자격 요건에도 GPU 사이징을 포함한 LLM 추론 실무 경험을 꼽았어요.
공고는 가격과 성능을 보여 주는 데모, 레퍼런스 연동, 벤치마크 비교 자료 구축을 할 일로 꼽았어요. 자격 요건에는 비용과 성능의 트레이드오프를 엔지니어와 경영진 모두에게 설명할 수 있어야 한다고 적었어요.
망고부스트 FDE 가 고객사와 LLMBoost 도입 PoC 를 진행하면서 GPU 구성과 견적을 정할 때 여는 관리자 페이지예요. 고객사 워크로드마다 지금까지 잰 벤치마크 가운데 그 조건으로 잰 실행이 있는지, 그중에 응답 속도와 처리량 목표를 맞추는 구성이 있는지, 그 구성의 월 비용이 예산 안에 드는지 알려 주고, 예산 안에 드는 가장 싼 GPU 종류와 장수를 제안해요. 받은 데이터를 담을 DB 설계와 기술·구조, 그리고 월 비용을 낼 때 한 달 운영 시간을 몇 시간으로 잡을지는 지원자가 정해요.
고객사 ML 인프라 담당자와 LLMBoost 도입 PoC 를 진행하는 망고부스트의 Forward Deployed Engineer 예요. 고객이 돌릴 워크로드가 여러 개면 워크로드마다 모델·동시 사용자 수·컨텍스트 길이·응답 속도 목표·예산이 달라서, 잰 적 없는 조건을 비슷한 벤치마크로 어림하면 PoC 에서 목표를 못 맞추거나 GPU 를 너무 많이 잡은 견적을 내게 돼요.
고객사가 PoC 에서 돌리려는 워크로드예요. 한 행이 워크로드 하나이고 workload_id 가 키예요. customer_id 는 고객사 코드이고, 한 워크로드는 한 고객사에만 속해요. model_id 는 이 워크로드에 쓸 모델로, 벤치마크 실행 기록의 model_id 와 같은 표기예요. concurrent_users 는 고객사가 말한 동시 사용자 수, context_tokens 는 요청 한 건에 들어가는 입력 토큰 수예요. first_token_p95_target_ms 는 요청을 보낸 뒤 첫 출력 토큰을 받기까지 걸리는 시간의 95번째 백분위 목표(밀리초), min_output_tokens_per_sec 는 동시 사용자 전체에 초당 내보내야 하는 출력 토큰 수의 하한, monthly_budget_krw 는 이 워크로드에 쓸 수 있는 한 달 GPU 비용 상한(원, 부가세 별도)이에요. 이름 앞부분이 같은 다른 모델(dense-8b 와 dense-8b-fp8)을 쓰는 워크로드, 같은 모델을 쓰면서 조건과 목표가 다른 워크로드, 지금까지 잰 실행보다 큰 동시 사용자 수를 요구하는 워크로드가 들어 있어요. 큰 데이터에는 아직 한 번도 재지 않은 모델을 쓰는 워크로드도 9개 있어요. 큰 데이터는 고객사 48곳의 워크로드 277개이고, 시작용은 그 가운데 고객사 CU-07 의 워크로드 7개 전부를 같은 ID·같은 값으로 잘라 낸 것이에요.
전체 7행 가운데 앞 5행이에요.
| workload_id | customer_id | name | model_id | concurrent_users | context_tokens | first_token_p95_target_ms | min_output_tokens_per_sec | monthly_budget_krw |
|---|---|---|---|---|---|---|---|---|
| WL-0038 | CU-07 | 상담 요약 | dense-70b | 120 | 8,192 | 2,500 | 3,000 | 25,000,000 |
| WL-0039 | CU-07 | 내부 문서 검색 | dense-72b | 96 | 32,768 | 4,500 | 2,400 | 12,000,000 |
| WL-0040 | CU-07 | 코딩 보조 | moe-671b | 200 | 16,384 | 2,000 | 7,700 | 60,000,000 |
| WL-0041 | CU-07 | 민원 분류 | dense-8b | 1,500 | 4,096 | 1,500 | 20,000 | 10,000,000 |
| WL-0042 | CU-07 | 회의록 정리 | dense-70b | 48 | 32,768 | 8,000 | 1,200 | 9,000,000 |
7행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 277행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "고객사 워크로드 하나. 키는 workload_id.",
"additionalProperties": false,
"required": [
"workload_id",
"customer_id",
"name",
"model_id",
"concurrent_users",
"context_tokens",
"first_token_p95_target_ms",
"min_output_tokens_per_sec",
"monthly_budget_krw"
],
"properties": {
"workload_id": {
"type": "string",
"pattern": "^WL-[0-9]{4}$",
"description": "워크로드 번호. 이 표의 키예요."
},
"customer_id": {
"type": "string",
"pattern": "^CU-[0-9]{2}$",
"description": "고객사 코드(CU-01~CU-48). 한 워크로드는 한 고객사에만 속해요."
},
"name": {
"type": "string",
"description": "고객사가 부르는 워크로드 이름. 한 고객사 안에서는 겹치지 않아요."
},
"model_id": {
"type": "string",
"description": "이 워크로드에 쓸 모델. 모델과 정밀도를 함께 가리키고, benchmark_runs.model_id 와 같은 표기예요. 이름 앞부분이 같아도 글자가 다르면 다른 모델이에요."
},
"concurrent_users": {
"type": "integer",
"minimum": 1,
"description": "고객사가 말한 동시 사용자 수(명)."
},
"context_tokens": {
"type": "integer",
"minimum": 1,
"description": "요청 한 건에 들어가는 입력 토큰 수(토큰)."
},
"first_token_p95_target_ms": {
"type": "integer",
"minimum": 1,
"description": "요청을 보낸 뒤 첫 출력 토큰을 받기까지 걸리는 시간의 95번째 백분위 목표(밀리초). 이 값 이하를 원해요."
},
"min_output_tokens_per_sec": {
"type": "integer",
"minimum": 1,
"description": "동시 사용자 전체에 초당 내보내야 하는 출력 토큰 수의 하한(토큰/초)."
},
"monthly_budget_krw": {
"type": "integer",
"minimum": 1,
"description": "이 워크로드에 쓸 수 있는 한 달 GPU 비용 상한(원, 정수, 부가세 별도)."
}
}
}모델 하나를 GPU 구성 하나에 띄우고, 정한 동시 사용자 수와 컨텍스트 길이로 부하를 걸어 잰 벤치마크 실행이에요. 한 행이 실행 한 번이고 run_id 가 키예요. model_id 는 모델과 정밀도를 함께 가리키고, 이름 앞부분이 같아도 글자가 다르면 다른 모델이에요. gpu_type 은 gpu_prices.gpu_type 을 가리키고, gpu_count 는 그 실행에 쓴 GPU 장수예요. concurrent_users 는 부하 발생기가 실행 내내 유지한 동시 사용자 수, context_tokens 는 요청마다 넣은 입력 토큰 수예요. outcome 은 completed(측정 구간을 마침)와 out_of_memory(측정 구간에 들어가기 전에 GPU 메모리가 모자라 서빙 서버가 멈춤) 둘 중 하나이고, out_of_memory 실행은 측정 구간의 두 시각과 두 누계 값이 비어 있어요(null). 측정 구간은 300초이고, output_tokens_counter_start·output_tokens_counter_end 는 서빙 서버가 켜진 뒤 모든 요청에 내보낸 출력 토큰 누계를 부하 발생기가 측정 구간 시작과 끝에 읽은 값이에요. 시각은 모두 부하 발생기 시계로 찍은 한국 시간이에요. 같은 모델을 GPU 종류나 장수만 바꿔 잰 실행, 동시 사용자 수와 컨텍스트 길이 가운데 한쪽만 큰 실행, 메모리가 모자라 멈춘 실행이 들어 있어요. 큰 데이터는 2026년 3월 2일부터 2026년 10월 16일까지 모델 41개로 잰 실행 1,164번 전부이고, 시작용은 CU-07 워크로드가 쓰는 모델 5개로 잰 실행 13번 전부예요.
전체 13행 가운데 앞 5행이에요.
| run_id | model_id | gpu_type | gpu_count | concurrent_users | context_tokens | outcome | started_at | measure_started_at | measure_ended_at | output_tokens_counter_start | output_tokens_counter_end |
|---|---|---|---|---|---|---|---|---|---|---|---|
| BR-00057 | dense-70b | MI300X | 4 | 64 | 32,768 | completed | 2026-03-14T01:56:36+09:00 | 2026-03-14T01:59:43+09:00 | 2026-03-14T02:04:43+09:00 | 5,430,883,256 | 5,431,340,613 |
| BR-00372 | moe-671b | MI300X | 8 | 256 | 16,384 | completed | 2026-05-16T12:29:45+09:00 | 2026-05-16T12:36:29+09:00 | 2026-05-16T12:41:29+09:00 | 7,428,431,941 | 7,430,886,430 |
| BR-00434 | moe-671b | MI300X | 4 | 256 | 16,384 | out_of_memory | 2026-05-28T14:03:18+09:00 | — | — | — | — |
| BR-00481 | dense-70b | MI300X | 4 | 128 | 8,192 | completed | 2026-06-08T16:59:29+09:00 | 2026-06-08T17:03:26+09:00 | 2026-06-08T17:08:26+09:00 | 3,139,559,350 | 3,140,592,929 |
| BR-00521 | dense-8b | MI300X | 1 | 800 | 4,096 | completed | 2026-06-15T23:22:06+09:00 | 2026-06-15T23:28:54+09:00 | 2026-06-15T23:33:54+09:00 | 8,103,826,687 | 8,109,337,397 |
13행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 1,164행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "벤치마크 실행 한 번. 키는 run_id.",
"additionalProperties": false,
"required": [
"run_id",
"model_id",
"gpu_type",
"gpu_count",
"concurrent_users",
"context_tokens",
"outcome",
"started_at",
"measure_started_at",
"measure_ended_at",
"output_tokens_counter_start",
"output_tokens_counter_end"
],
"properties": {
"run_id": {
"type": "string",
"pattern": "^BR-[0-9]{5}$",
"description": "실행 번호. 시작 시각 순으로 붙어요. 이 표의 키예요."
},
"model_id": {
"type": "string",
"description": "띄운 모델. 모델과 정밀도를 함께 가리켜요(dense-8b 와 dense-8b-fp8 은 다른 모델이에요)."
},
"gpu_type": {
"type": "string",
"enum": [
"MI300X",
"MI325X",
"MI355X"
],
"description": "쓴 GPU 종류. gpu_prices.gpu_type 을 가리켜요."
},
"gpu_count": {
"type": "integer",
"enum": [
1,
2,
4,
8
],
"description": "쓴 GPU 장수(장)."
},
"concurrent_users": {
"type": "integer",
"minimum": 1,
"description": "부하 발생기가 실행 내내 유지한 동시 사용자 수(명)."
},
"context_tokens": {
"type": "integer",
"minimum": 1,
"description": "요청마다 넣은 입력 토큰 수(토큰)."
},
"outcome": {
"type": "string",
"enum": [
"completed",
"out_of_memory"
],
"description": "completed 는 측정 구간을 마친 실행, out_of_memory 는 측정 구간에 들어가기 전에 GPU 메모리가 모자라 서빙 서버가 멈춘 실행이에요."
},
"started_at": {
"type": "string",
"format": "date-time",
"description": "실행을 시작한 시각. 부하 발생기 시계, 한국 시간(+09:00) ISO 8601, 초 단위."
},
"measure_started_at": {
"type": [
"string",
"null"
],
"format": "date-time",
"description": "측정 구간을 시작한 시각. 부하 발생기 시계, 한국 시간(+09:00) ISO 8601, 초 단위. out_of_memory 실행은 null 이에요."
},
"measure_ended_at": {
"type": [
"string",
"null"
],
"format": "date-time",
"description": "측정 구간을 마친 시각(시작 300초 뒤). 부하 발생기 시계, 한국 시간(+09:00) ISO 8601, 초 단위. out_of_memory 실행은 null 이에요."
},
"output_tokens_counter_start": {
"type": [
"integer",
"null"
],
"minimum": 0,
"description": "서빙 서버가 켜진 뒤 모든 요청에 내보낸 출력 토큰 누계를 부하 발생기가 measure_started_at 에 읽은 값(토큰). out_of_memory 실행은 null 이에요."
},
"output_tokens_counter_end": {
"type": [
"integer",
"null"
],
"minimum": 0,
"description": "같은 누계를 measure_ended_at 에 읽은 값(토큰). out_of_memory 실행은 null 이에요."
}
}
}실행마다 측정 구간에 보낸 측정 요청이에요. 부하 발생기는 부하를 건 채로 측정 구간이 시작되면 15초 간격으로 측정 요청을 20건 보내고, 한 행이 그 한 건이에요. run_id 와 probe_no(1~20) 묶음이 키이고, run_id 는 benchmark_runs.run_id 를 가리켜요. sent_at 은 보낸 시각(부하 발생기 시계, 한국 시간), first_token_ms 는 보낸 순간부터 첫 출력 토큰을 받은 순간까지 부하 발생기가 잰 시간(밀리초)이에요. out_of_memory 로 끝난 실행에는 행이 없어요. 대부분은 고르게 빠르고 두세 건만 이어서 크게 느린 실행이 들어 있어요. 큰 데이터는 completed 실행 1,063번의 측정 요청 21,260건 전부이고, 시작용은 시작용 실행 가운데 completed 11번의 측정 요청 220건 전부예요.
전체 220행 가운데 앞 5행이에요.
| run_id | probe_no | sent_at | first_token_ms |
|---|---|---|---|
| BR-00057 | 1 | 2026-03-14T01:59:43+09:00 | 4,788 |
| BR-00057 | 2 | 2026-03-14T01:59:58+09:00 | 5,339 |
| BR-00057 | 3 | 2026-03-14T02:00:13+09:00 | 5,222 |
| BR-00057 | 4 | 2026-03-14T02:00:28+09:00 | 5,327 |
| BR-00057 | 5 | 2026-03-14T02:00:43+09:00 | 5,803 |
220행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 21,260행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "측정 요청 한 건. 키는 (run_id, probe_no) 묶음.",
"additionalProperties": false,
"required": [
"run_id",
"probe_no",
"sent_at",
"first_token_ms"
],
"properties": {
"run_id": {
"type": "string",
"pattern": "^BR-[0-9]{5}$",
"description": "이 요청을 보낸 실행. benchmark_runs.run_id 를 가리키고, outcome 이 completed 인 실행만 나와요."
},
"probe_no": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"description": "그 실행 안에서 보낸 순서(1~20)."
},
"sent_at": {
"type": "string",
"format": "date-time",
"description": "측정 요청을 보낸 시각. 부하 발생기 시계, 한국 시간(+09:00) ISO 8601, 초 단위."
},
"first_token_ms": {
"type": "integer",
"minimum": 1,
"description": "보낸 순간부터 첫 출력 토큰을 받은 순간까지 부하 발생기가 잰 시간(밀리초)."
}
}
}견적에 쓰는 GPU 종류별 단가예요. 한 행이 GPU 종류 하나이고 gpu_type 이 키예요. hourly_price_krw 는 GPU 한 장을 한 시간 쓰는 값(원, 정수, 부가세 별도)이고, 이 데이터에서는 GPU 종류마다 단가가 하나로 정해져 있어요. 시작용과 큰 데이터는 같은 3행이에요.
전체 3행 가운데 앞 3행이에요.
| gpu_type | hourly_price_krw |
|---|---|
| MI300X | 3,900 |
| MI325X | 4,900 |
| MI355X | 6,400 |
3행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 3행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "GPU 종류 하나의 단가. 키는 gpu_type.",
"additionalProperties": false,
"required": [
"gpu_type",
"hourly_price_krw"
],
"properties": {
"gpu_type": {
"type": "string",
"enum": [
"MI300X",
"MI325X",
"MI355X"
],
"description": "GPU 종류. 이 표의 키예요."
},
"hourly_price_krw": {
"type": "integer",
"minimum": 1,
"description": "GPU 한 장을 한 시간 쓰는 값(원, 정수, 부가세 별도)."
}
}
}근거: 고객 배포 설계 및 구축 (모델 선정, 처리량·지연 목표, GPU 사이징, 비용 산정 포함)