spinf-serve, 문서 한 번 읽고 수천 개 질문을 확률로 채점한다
spinf-serve는 문서 하나를 한 번만 읽고 그 문서에 대한 여러 질문을 동시에 확률로 채점하는 추론 서버다. 답을 문장으로 생성하는 대신 사용자가 제시한 선택지 각각에 대한 확률을 돌려준다. Apache 2.0 라이선스로 공개됐고 OpenAI 호환 API를 제공한다.
중심은 /v1/score 엔드포인트다. 요청에 콘텐츠와 여러 개의 템플릿·선택지를 담으면 질문마다 선택지별 확률 p와 로그확률, 그리고 아무 내용도 넣지 않았을 때의 확률 floor_p가 함께 온다. p에서 floor_p를 빼면 콘텐츠가 판단을 얼마나 움직였는지 드러나고, 선택지 밖 단어로 새어나간 확률은 residual로 표시된다. 템플릿 자리표시자로 질문 묶음을 한꺼번에 만들 수 있고, {*}는 텍스트, {n}은 숫자, {$}는 금액을 같은 읽기에서 뽑아낸다.
실행 조건은 리눅스와 24GB 메모리를 갖춘 엔비디아 GPU다. fp8 텐서 코어를 지원하는 Ada·Hopper·Blackwell 세대(RTX 4090·5090, L4, L40S, RTX 6000 Ada, H100)를 전제로 하며 CUDA 13 드라이버와 파이썬 3.12가 필요하다. Ampere 카드는 int8 가중치로 동작한다. pip 설치 뒤 명령 한 줄로 기본 모델인 spinf/gemma-4-12b-fp8을 내려받아 8000번 포트에 띄울 수 있고, 컨테이너 이미지도 함께 제공된다.
개발팀은 매일 수백만 건의 뉴스 기사에서 시장 지수를 뽑는 작업을 하면서 이 엔진을 만들었다. 기사 하나에 수십 개의 좁고 보정된 질문을 던지는 구조였는데, 채팅용으로 설계된 서빙 엔진은 질문마다 콘텐츠를 처음부터 다시 읽고 토큰을 하나씩 생성해서 느리고 값비쌌다. 그래서 질문들을 한 번의 읽기에서 갈라지는 분기로 배치하고 여러 콘텐츠를 하나의 포워드 패스에 묶는 방식을 택했다. 호스팅 서비스 api.spinf.com도 이 엔진에서 출발했으며, 자체 하드웨어에서 돌리고 싶다는 요청이 이어져 공개로 이어졌다.
성능 비교도 함께 공개됐다. RTX 4090 한 장에 Gemma 4 12B fp8을 올리고 약 470토큰짜리 위키뉴스 기사 24건에 각각 56개의 예/아니오 질문, 총 1,344개 질문을 HTTP로 보냈다. 프리픽스 캐싱을 켠 vLLM 0.26은 1,344번의 단일 토큰 요청을 처리하지만, spinf-serve는 56개 질문을 한 번의 읽기에서 분기시키고 24개 기사를 16k 토큰 패스 두 번에 담는다. 콘텐츠당 질문 수가 늘수록 격차도 벌어진다. 106개 질문과 22개 카테고리로 구성된 moderation 팩은 시간당 약 2만 건의 메시지를 채점하고, 74개 질문을 던지는 뉴스 기사는 초당 거의 700개 질문 속도로 읽힌다.
프롬프트 팩은 이 서버의 실사용 단위다. 콘텐츠 모더레이션, 트리아지, 상품 목록, 리뷰, 브랜드, 엔터테인먼트 같은 작업별로 미리 보정된 질문 묶음을 파일 하나로 제공하며, 질문 목록과 콘텐츠 제시 방식, 답을 점수로 바꾸는 규칙, 점수를 결정으로 바꾸는 기준이 모두 그 안에 들어 있다. 서버가 팩을 미리 적재하고 요청에서 id만 지정하면 같은 읽기에서 팩의 카테고리와 결정이 함께 돌아온다. 공식 팩은 기본으로 로드되고 --packs 옵션으로 GitHub 저장소나 로컬 폴더를 추가할 수 있다.
실무에서 달라지는 지점은 처리량 중심 설계다. 질문마다 요청을 날리는 대신 한 요청에 질문 그리드를 넣고, 결정 임계값은 자기 데이터로 정한다. fp8 체크포인트에서는 어떤 콘텐츠의 점수가 혼자 채점될 때와 수천 건과 함께 묶일 때 비트 단위로 같아서 배치 구성 때문에 결과가 흔들리지 않으며, system_fingerprint로 두 결과가 같은 조건인지 확인할 수 있다. 이미지·오디오·영상 프레임을 읽는 모델은 해당 미디어를 콘텐츠에 넣을 수 있고, OpenAI SDK는 /v1/chat/completions에 scoring 블록을 extra_body로 실어 호출한다. 베이스 URL과 키만 바꾸면 자체 서버와 호스팅 서비스를 오갈 수 있다.
주의할 전제도 분명하다. 이 서버는 채팅 서버가 아니다. 요청하지 않으면 아무것도 생성하지 않고, 단일 요청 지연시간보다 전체 처리량에 맞춰져 있다. 추출 슬롯은 추가 디코딩 비용이 붙어 검색형 슬롯은 200~600토큰, 생성형 슬롯은 최대 2,000토큰 상당의 비용이 든다. 버전은 0.1이며, 확률을 실제 결정으로 쓰려면 자기 데이터에 맞춘 보정이 전제된다.