클리카는 오픈소스에 의존하지 않고 모델 압축·최적화 원천기술을 직접 개발해 GPU 서버·엣지 디바이스·차량·로봇·산업 장비에 AI 모델을 설치·배포하고, 그걸 여러 프로젝트에 반복 적용 가능한 제품 capability 로 발전시킵니다. 상용화 1년 만에 미국·호주·싱가포르·한국의 정부기관 고객을 확보한 배포 중심 회사라, 모델을 장비 제약에 맞게 최적화하고 실제로 돌려 배포 가능 여부를 판정하는 이 하니스가 그 코어(모델 최적화에서 컨테이너, 추론 서빙, 측정, 배포 판정)를 정면으로 입증합니다. 다만 이 공고는 경력 FDE 이고 실 로봇 제어·차량과 선박 하드웨어 물리·C++ 임베디드 최적화 깊이는 포트폴리오로 증명되지 않으므로 주장하지 않으며, 로보틱스는 테마로만 닿게 했습니다. 장비별 제약에 맞춰 모델을 최적화·배포·판정하는 사슬은 단순 모델 추론 데모로는 그대로 만들 수 없습니다.
클리카는 모델 압축·최적화 원천기술을 직접 개발해 고객의 하드웨어 환경에 AI 모델을 설치·배포합니다. 장비 제약에 맞춰 모델을 최적화·배포하는 이 하니스가 정면으로 정렬됩니다.
VLM·컴퓨터 비전 모델의 전처리·추론·후처리 파이프라인을 고객 환경에 맞게 구성하고 개선합니다. 모델 변환·양자화·추론까지 잇는 하니스가 이 업무와 맞닿습니다.
일회성 커스터마이징 대신 여러 프로젝트에 반복 적용 가능한 제품 capability 로 발전시킵니다. 장비만 바꿔 끼우면 재사용되는 배포 하니스가 이 지향과 맞습니다.
목표 엣지 장비 프로파일(장비·런타임·VRAM·지연 예산·정밀도)과 라벨된 카메라 테스트 프레임을 받아, 원본 PyTorch 비전 모델을 ONNX 로 내보내고 INT8 로 양자화한 뒤 도커로 싸서 onnxruntime 으로 실제 추론을 돌리고, 지연·메모리·양자화 정확도 손실을 측정해 그 장비 예산에 맞는지 pass/fail 로 판정합니다. 판정은 측정값과 규칙이 내고, Claude 는 왜 통과·미달인지와 어떤 런타임·정밀도로 바꾸면 되는지 튜닝 처방만 씁니다. 장비 마스터를 붙여 표기를 정규화하고, 미등록 장비·미측정 필드는 단정하지 않고 알립니다. 추상 점검이 아니라 한 명령에 끝까지 실제로 도는 배포 하니스입니다.
클리카 FDE 가 만드는 이 도구의 사용자는 고객 현장에서 로봇·차량 엣지 장비에 AI 모델을 올려야 하는 배포 엔지니어 본인입니다. 모델을 장비마다 ONNX 로 바꾸고 양자화하고 도커로 싸고 지연·메모리를 손으로 재던 일을, 장비 프로파일만 넣으면 한 번에 돌려보고 이 장비에 올려도 되는지 판정까지 받고 싶은 사람입니다.
목표 장비 프로파일과 원본 모델을 한 스키마로 묶으면, (a) ONNX 변환·양자화·도커 패키징·추론을 한 명령으로 실제 구동하고, (b) 지연·메모리·정확도 손실을 측정해 장비 예산 대비 pass/fail 을 규칙으로 판정하며, (c) Claude 가 측정값을 인용해 어떤 런타임·정밀도로 바꾸면 예산에 드는지 처방합니다.
PyTorch 비전 모델과 장비 프로파일을 넣으면 ONNX 변환·INT8 양자화·도커 빌드·onnxruntime 추론까지 실제로 돌아가고 지연·메모리를 재서 배포 pass/fail 판정과 튜닝 처방을 내는 동작하는 도구입니다. 무거운 실 엣지 장비와 TensorRT 대신 로컬에서 장비 예산을 흉내 낸 제약으로 시작합니다.
라벨 프레임으로 fp32 대비 int8 정확도 손실을 측정하고, Claude 처방대로 런타임·정밀도를 바꿔 재측정해 예산 충족 여부를 대조하는 화면입니다.
onnx·tensorrt·openvino·litert 와 장비 조합을 배치로 돌려 장비별 최적 런타임·정밀도 조합을 추천 표로 뽑는 자동화입니다.
MobileViT·YOLO-nano 급 모델과 장비 프로파일을 넣으면 ONNX 변환에서 INT8 양자화, 도커 빌드, onnxruntime 추론까지 한 명령으로 끝까지 실제로 도는 걸 시연합니다
일부러 만든 악성·결측 입력 30종(VRAM 미계측·미등록 장비·장비 표기 흔들림·손상 프레임)을 넣어도 하니스가 멈추지 않고 '미매핑·미측정'으로 알리며 출력 형식(스키마)이 한 번도 안 깨집니다
장비 예산(지연·메모리) 대비 pass/fail 판정과 양자화 정확도 손실을 장비 프로파일 3종에서 실제로 측정해 보여줍니다. 단, 정확도 라벨은 작성자가 만든 합성 프레임 기준이고 지연·메모리는 로컬 장비에서 엣지 예산을 흉내 낸 값이라 실제 장비 성능이 아님을 명시합니다
진짜 성능 검증은 여기서 멈춥니다. 위 지연·메모리·정확도 손실은 로컬에서 엣지 제약을 흉내 낸 값과 작성자가 만든 합성 라벨이며, 실제 지연·정확도는 클리카가 배포하는 실 엣지 장비(Jetson 등)와 실 카메라 스트림이 있어야 측정 가능합니다. 이 하니스는 그 장비만 붙이면 바로 측정을 돌릴 수 있는 상태까지 만듭니다
이건 고객·실데이터 없이 혼자 만든 포트폴리오입니다. 파이프라인은 실제로 끝까지 돌지만 정확도 라벨과 엣지 제약은 합성이라 성능 증명이 아닙니다. 면접에서는 실제 구동 데모와 실검증 준비 상태로 솔직히 설명하는 게 오히려 신뢰를 줍니다
정답 라벨과 장비 예산을 작성자가 만들었으니 잘 맞는 게 당연합니다. 그래서 손상 프레임·미등록 장비·VRAM 미계측·극단 지연 예산 같은 결측·경계 케이스를 더미에 일부러 섞어, 쉬운 장비만 통과시키는 게 아님을 보여줍니다
이 포트폴리오가 입증하는 것은 모델 최적화에서 컨테이너 패키징, 추론 서빙, 측정, 배포 판정으로 잇는 배포 사슬 기술입니다. 실제 로봇 제어(ROS)·차량과 선박 하드웨어 물리·C++ 임베디드 최적화 깊이·현장 대응 경험은 포트폴리오로 증명되지 않으므로 주장하지 않으며, 로보틱스는 테마로만 닿게 했습니다. 모르는 도메인 깊이는 면접에서 솔직히 말하는 편이 낫습니다
실제 도입 때는 실 엣지 장비 드라이버·TensorRT 버전·실 카메라 프레임 분포가 더미와 다릅니다. 그래서 로컬 흉내 측정과 온프레미스 실측정 교체, 실 검수자 교체를 도입 단계 과제로 분리해 명시합니다
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
목표 엣지 장비 프로파일. 배포 판정·양자화 설정·진단이 가장 먼저 질의하는 테이블입니다. VRAM 미계측·미등록 장비·장비 표기 흔들림·극단 지연 예산을 일부러 섞어 쉬운 장비만 통과시키지 않게 합니다.
| profile_id | device_raw | device_id | runtime | vram_mb | compute_tops | latency_budget_ms | precision | max_image_px |
|---|---|---|---|---|---|---|---|---|
| p_01 | Jetson Orin Nano | jetson_orin_nano | tensorrt | 8,192 | 40 | 50 | int8 | 640 |
| p_02 | 젯슨 오린 나노 | jetson_orin_nano | tensorrt | 8,192 | 40 | 50 | fp16 | 640 |
| p_03 | Jetson Xavier NX | jetson_xavier_nx | tensorrt | 8,192 | 21 | 80 | int8 | 512 |
| p_04 | GPU 서버 A100 | gpu_a100 | onnx | 40,960 | 312 | 15 | fp16 | 1,280 |
| p_05 | 산업용 미니PC (OpenVINO) | minipc_openvino | openvino | — | — | 120 | int8 | 416 |
아래 JSON Schema 에 맞는 목표 엣지 장비 프로파일 40행을 JSON 배열로 생성합니다. 장비 종류는 Jetson·GPU 서버·산업용 미니PC·차량 ECU·모바일을 고루 섞고 runtime 은 onnx/tensorrt/openvino/qnn/litert 를 분포시킵니다. latency_budget_ms 는 장비 성능과 대체로 정합되게 둡니다.
{"type":"object","properties":{"profile_id":{"type":"string"},"device_raw":{"type":"string"},"device_id":{"type":["string","null"]},"runtime":{"type":"string","enum":["onnx","tensorrt","openvino","qnn","litert"]},"vram_mb":{"type":["number","null"]},"compute_tops":{"type":["number","null"]},"latency_budget_ms":{"type":"number"},"precision":{"type":"string","enum":["fp32","fp16","int8"]},"max_image_px":{"type":"number"}},"required":["profile_id","device_raw","runtime","latency_budget_ms","precision"]}
쉬운 데이터만 만들지 말 것, 다음 하드 케이스를 의도적으로 섞어라(쉬운 장비만 다루는 함정 회피): (1) 같은 장비의 표기 별칭('Jetson Orin Nano'/'젯슨 오린 나노'/'Jetson Orin Nano '처럼 device_master 로 device_id 가 같게 정규화돼야 함) 4건 이상, (2) 미등록 장비(device_id=null) 3건, (3) 결측: vram_mb 또는 compute_tops 가 null 인 미계측 행 각 2건, (4) 경계값으로 latency_budget_ms 극단(8ms 모바일·500ms 여유)과 precision int8 각 3건. 형식을 일부러 깨뜨리는 시도 5건(문자열이어야 할 profile_id 에 숫자, runtime 에 enum 밖 값)도 별도로 만들어 하니스가 거르는지 확인합니다. 정상 행은 위 스키마를 통과해야 합니다. JSON 배열만 출력합니다.{"type":"object","properties":{"profile_id":{"type":"string"},"device_raw":{"type":"string"},"device_id":{"type":["string","null"]},"runtime":{"type":"string","enum":["onnx","tensorrt","openvino","qnn","litert"]},"vram_mb":{"type":["number","null"]},"compute_tops":{"type":["number","null"]},"latency_budget_ms":{"type":"number"},"precision":{"type":"string","enum":["fp32","fp16","int8"]},"max_image_px":{"type":"number"}},"required":["profile_id","device_raw","runtime","latency_budget_ms","precision"]}라벨된 카메라 테스트 프레임. 양자화 전후 정확도 손실을 재는 자가채점 기준입니다. 분류만 라벨된 프레임(gt_bbox null)·손상 프레임·저조도·모션블러 경계를 일부러 섞습니다.
| frame_id | image_ref | scene | gt_label | gt_bbox | difficulty | corrupt |
|---|---|---|---|---|---|---|
| f_01 | frames/indoor_0001.jpg | indoor | person | [120,80,210,360] | easy | false |
| f_02 | frames/road_0007.jpg | road | car | [300,210,480,340] | easy | false |
| f_03 | frames/dock_0012.jpg | dock | forklift | [60,140,420,470] | occluded | false |
| f_04 | frames/factory_0003.jpg | factory | pallet | — | easy | false |
| f_05 | frames/road_0021.jpg | road | pedestrian | [510,180,560,320] | lowlight | false |
아래 JSON Schema 에 맞는 라벨된 카메라 테스트 프레임 40행을 JSON 배열로 생성합니다. scene(indoor/road/dock/factory)과 difficulty(easy/occluded/lowlight/motion_blur)를 고루 섞고 gt_label 은 장면에 맞는 객체명으로 둡니다.
{"type":"object","properties":{"frame_id":{"type":"string"},"image_ref":{"type":"string"},"scene":{"type":"string","enum":["indoor","road","dock","factory"]},"gt_label":{"type":"string"},"gt_bbox":{"type":["array","null"],"items":{"type":"number"}},"difficulty":{"type":"string","enum":["easy","occluded","lowlight","motion_blur"]},"corrupt":{"type":"boolean"}},"required":["frame_id","image_ref","scene","gt_label","difficulty","corrupt"]}
쉬운 데이터만 만들지 말 것, 다음 하드 케이스를 의도적으로 섞어라(깨끗한 프레임만 넣는 함정 회피): (1) 분류만 라벨돼 gt_bbox=null 인 행 5건 이상, (2) 손상 프레임(corrupt=true) 3건, (3) 경계 난이도로 lowlight·motion_blur 각 4건, occluded 4건, (4) 같은 장면 유형에 서로 다른 객체가 섞이게. 형식을 일부러 깨뜨리는 시도 5건(scene 에 enum 밖 값, corrupt 에 문자열)도 별도로 만들어 하니스가 거르는지 확인합니다. 정상 행은 위 스키마를 통과해야 합니다. JSON 배열만 출력합니다.{"type":"object","properties":{"frame_id":{"type":"string"},"image_ref":{"type":"string"},"scene":{"type":"string","enum":["indoor","road","dock","factory"]},"gt_label":{"type":"string"},"gt_bbox":{"type":["array","null"],"items":{"type":"number"}},"difficulty":{"type":"string","enum":["easy","occluded","lowlight","motion_blur"]},"corrupt":{"type":"boolean"}},"required":["frame_id","image_ref","scene","gt_label","difficulty","corrupt"]}| Python | 배포 하니스·모델 변환·양자화·측정 스크립트의 구현 언어입니다 |
| C++ | 엣지 런타임(ONNX Runtime·TensorRT) 커스텀 전처리 연동을 가정하는 성능 임계 경로입니다 |
| PyTorch | 원본 비전·VLM 모델을 로드해 ONNX 로 내보내는 소스입니다 |
| Docker | 목표 장비를 가정한 추론 이미지를 실제로 빌드·구동하는 패키징입니다 |
| FastAPI | 배포된 추론을 REST 로 노출하는 서빙 엔드포인트입니다 |
| Django | 고객 기존 스택이 Django 면 추론 엔드포인트를 그 위에 얹는 대안입니다(기본은 FastAPI) |
| Flask | 가벼운 현장 데모용 추론 엔드포인트 대안입니다(기본은 FastAPI) |
| REST | 고객 시스템·장비와 추론을 주고받는 연동 규격입니다 |
| Linux | 빌드·배포·로그 분석을 수행하는 실행 환경입니다 |
| VLM | 로봇 카메라 장면 이해 대상 모델로, 양자화·배포 대상입니다 |
| LLM | 측정 지표와 로그를 읽어 배포 진단·튜닝 처방을 쓰는 Claude 입니다 |
| 딥러닝 | 양자화 전후 정확도 손실 평가의 기반입니다 |
| ONNX | 프레임워크 독립 모델 포맷으로 변환·양자화·추론의 중심 런타임입니다 |
| TensorRT | Jetson·GPU 장비용 최적화 런타임 선택지입니다(2주차부터 실측) |
| OpenVINO | 산업용 미니PC·CPU 장비용 런타임 선택지입니다 |
| QNN | 퀄컴 보드용 런타임 선택지로 프로파일 enum 에 둡니다 |
| LiteRT | 모바일·경량 장비용 런타임 선택지로 프로파일 enum 에 둡니다 |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 2주차(양자화 손실 검증·진단 대조)로 진행합니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우면 3주차(다중 런타임·장비 매트릭스 자동화)로 진행합니다.
장비 1건의 배포 진단. 측정 지표·판정·튜닝 처방을 한 스키마로 담아 리포트 카드에 씁니다. 판정은 규칙이 내고 Claude 는 근거·처방만 씁니다.
{"type":"object","properties":{"device_id":{"type":["string","null"]},"verdict":{"type":"string","enum":["deployable","needs_tuning","blocked","unmeasurable"]},"measured":{"type":"object","properties":{"latency_ms":{"type":["number","null"]},"peak_vram_mb":{"type":["number","null"]},"accuracy_drop_pct":{"type":["number","null"]}},"required":["latency_ms","peak_vram_mb","accuracy_drop_pct"]},"factors":{"type":"array","items":{"type":"string","enum":["latency_over","vram_over","accuracy_drop_over","unmapped_device","unmeasured_field"]}},"prescription":{"type":"string"},"evidence":{"type":"array","items":{"type":"string"}},"reason":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["verdict","measured","factors","reason","evidence"]}[
{
"input_ref": "p_08 (모바일 LiteRT · 지연 예산 8ms · int8) + 모델 추론 측정",
"output": {
"device_id": "mobile_litert",
"verdict": "needs_tuning",
"measured": {
"latency_ms": 14.2,
"peak_vram_mb": 980,
"accuracy_drop_pct": 1.8
},
"factors": [
"latency_over"
],
"prescription": "입력 해상도를 224로 낮추고 litert int8 로 유지하되 백본을 더 가벼운 것으로 교체하면 8ms 예산에 들어갈 가능성이 큽니다.",
"evidence": [
"latency_ms=14.2 > latency_budget_ms=8",
"peak_vram_mb=980 <= vram_mb=3072",
"accuracy_drop_pct=1.8"
],
"reason": "측정 지연 14.2ms 가 예산 8ms 를 초과해 그대로는 배포할 수 없습니다. 메모리와 정확도 손실은 여유가 있어 지연만 줄이면 됩니다.",
"hedge": "지연은 로컬에서 예산을 흉내 낸 값이라 실제 모바일 장비 측정이 필요합니다"
}
},
{
"input_ref": "p_01 (Jetson Orin Nano · 지연 예산 50ms · int8) + 모델 추론 측정",
"output": {
"device_id": "jetson_orin_nano",
"verdict": "deployable",
"measured": {
"latency_ms": 31.5,
"peak_vram_mb": 2600,
"accuracy_drop_pct": 2.1
},
"factors": [],
"prescription": "현 설정(tensorrt int8, 640px) 그대로 배포 가능합니다. 추가 최적화는 필요 없습니다.",
"evidence": [
"latency_ms=31.5 <= latency_budget_ms=50",
"peak_vram_mb=2600 <= vram_mb=8192",
"accuracy_drop_pct=2.1"
],
"reason": "측정 지연 31.5ms 가 예산 50ms 안에 들고 메모리도 여유가 있으며 정확도 손실도 낮아 그대로 배포 가능합니다.",
"hedge": "측정은 로컬 흉내 값이라 실 Jetson 에서 재측정이 필요합니다"
}
},
{
"input_ref": "p_06 (차량 ECU 프로토타입 · device_id 미등록 · VRAM 2048)",
"output": {
"device_id": null,
"verdict": "unmeasurable",
"measured": {
"latency_ms": null,
"peak_vram_mb": null,
"accuracy_drop_pct": null
},
"factors": [
"unmapped_device"
],
"prescription": "장비가 장비 마스터에 없어 런타임·드라이버를 확정할 수 없습니다. 장비 등록 후 다시 측정해야 합니다.",
"evidence": [
"device_id=null",
"runtime=onnx"
],
"reason": "장비가 미등록이라 배포 판정을 내리지 않습니다. 추측 대신 장비 등록을 먼저 요청합니다.",
"hedge": "미등록 장비라 판정을 보류합니다"
}
},
{
"input_ref": "p_11 (GPU 서버 A100 · tensorrt · 지연 예산 10ms) + 측정",
"output": {
"device_id": "gpu_a100",
"verdict": "blocked",
"measured": {
"latency_ms": 6.4,
"peak_vram_mb": 41200,
"accuracy_drop_pct": 0.9
},
"factors": [
"vram_over"
],
"prescription": "피크 메모리가 장비 VRAM 을 넘습니다. 배치 크기를 1로 낮추거나 입력 해상도를 줄여 메모리를 낮춰야 합니다.",
"evidence": [
"peak_vram_mb=41200 > vram_mb=40960",
"latency_ms=6.4 <= latency_budget_ms=10"
],
"reason": "지연은 예산 안이지만 피크 메모리가 장비 VRAM 40960MB 를 초과해 그대로는 올릴 수 없습니다.",
"hedge": "메모리는 로컬 흉내 값이라 실 장비 측정이 필요합니다"
}
}
][자동 검증] 1. 출력이 스키마(필드·enum·measured 하위 형식)를 통과하는지 확인합니다. 2. factors 가 측정값과 예산의 규칙 판정과 일치하는지 봅니다(지연 초과는 latency_over, 피크 메모리 초과는 vram_over 등 결정적 규칙). 3. evidence 항목이 실제 측정 지표와 프로파일 값을 인용하는지, 미측정 필드나 프로파일에 없는 런타임을 인용하지 않는지 검사합니다. 4. verdict 를 규칙 판정 결과와 대조하고, 미등록 장비·미측정 필드면 단정을 보류합니다. [수동 검증] 1. 배포 엔지니어 2명이 처방을 실제로 적용 가능한지 비동기로 검토해 일치도를 봅니다. 2. 전체의 5% 를 사람이 직접 점검합니다.