본문으로 건너뛰기

© 2026 Molayo

llama.cpp헤드라인2026. 05. 22. 05:04

vocab : Carbon-3B (HybridDNATokenizer) 지원 추가 ( #23410 ) vocab : Carbon-3B (Hybri

요약

HuggingFaceBio의 Carbon-3B 모델을 지원하기 위해 HybridDNATokenizer를 위한 새로운 BPE 프리타입을 추가했습니다. DNA 염기 서열을 6-mer 단위로 청킹하고 처리하는 로직을 llama.cpp 컨벤션에 맞춰 구현하고 리팩터링했습니다.

핵심 포인트

  • Carbon-3B 모델용 HybridDNATokenizer 지원 추가
  • DNA 염기 서열을 6-mer 단위로 청킹 및 패딩 처리
  • llama.cpp 컨벤션에 맞춘 토크나이저 로직 리팩터링
  • 커스텀 토크나이저 로드를 위한 trust_remote_code 설정 적용
  • 12가지 케이스를 포함한 철저한 단위 테스트 수행

vocab : Carbon-3B (HybridDNATokenizer) 지원 추가 ( #23410 )

vocab : Carbon-3B (HybridDNATokenizer) 지원 추가

HuggingFaceBio/Carbon-{500M,3B,8B}에서 사용되는 HybridDNATokenizer를 위한 새로운 BPE 프리타입(pre-type)인 LLAMA_VOCAB_PRE_TYPE_CARBON을 추가합니다. 기본 BPE는 Qwen3-4B-Base의 것을 사용하며, 차이점은 ... 영역 내부의 텍스트가 고정된 6-mer로 청킹(chunked)된다는 점입니다 (끝부분이 불완전한 경우 'A'로 우측 패딩 처리). 또한 ACGT 이외의 모든 염기는 <UNK>로 매핑됩니다.

  • src/llama-vocab.{h,cpp}: 새로운 프리타입(pre-type)을 추가하였으며, llm_tokenizer_bpe_session::tokenize에서 디스패치(dispatched)됩니다.
  • src/llama-vocab-carbon.h: 단위 테스트(unit testing)를 위해 분리된 순수 헬퍼 함수들(tokenize_carbon, emit_dna_kmers) — llama_vocab 의존성 없이, vocab 접근은 std::function을 통해 이루어집니다.
  • conversion/base.py: get_vocab_base_pre에서 클래스 이름을 통해 HybridDNATokenizer를 감지합니다 (chktxt는 <UNK>가 없기 때문에 Qwen3 base와 충돌함). 또한 get_vocab_base에서 trust_remote_code=True를 전달하여 커스텀 토크나이저 클래스를 로드할 수 있도록 합니다.
  • tests/test-tokenizer-carbon.cpp: 단일 6-mer, 다중 6-mer, 소문자, 잘못된 염기 -> <UNK>, 부분 k-mer 우측 패딩, 텍스트+DNA 혼합, 빈 <UNK>, 종료되지 않은 <UNK>, 두 영역, vocab 누락 등 12가지 케이스를 다룹니다.

vocab : Carbon-3B 변경 사항을 llama.cpp 컨벤션에 맞게 정렬

Fold tokenize_carbon + emit_dna_kmers를 llm_tokenizer_bpe_session 내부에 인라인(inline)화 하여 (src/llama-vocab-carbon.h 제거), 다른 모든 토크나이저가 llama-vocab.cpp 내부에 헬퍼를 유지하는 방식과 일치시킵니다.

독립적인 단위 테스트를 models/ggml-vocab-carbon.gguf (vocab 전용 변환) 및 단일 6-mer, 다중 6-mer, 소문자, 잘못된 염기 -> <UNK>, 부분 우측 패딩, 텍스트+DNA 혼합, 빈 <UNK>, 종료되지 않은 <UNK>, 두 영역을 다루는 .inp/.out 픽스처(fixtures)를 사용하는 관례적인 test-tokenizer-0로 교체합니다.

convert_hf_to_gguf_update.py의 모델 리스트에 "carbon"을 등록하고 (HuggingFaceBio/Carbon-3B를 가리킴), 업데이트 도구의 두 AutoTokenizer 호출 지점에서 t5가 특수 처리되는 방식과 동일하게 trust_remote_code=True를 전달하도록 설정합니다.

vocab : Carbon 디스패치를 _set_vocab_carbon으로 이동 + LlamaModel 분기

공유된 get_vocab_base / get_vocab_base_pre 경로를 조건문으로 처리하는 대신, _set_vocab_qwen, _set_vocab_interns1, _set_vocab_glm 등이 사용하는 토크나이저 제품군별 관례(per-tokenizer-family convention)를 따르도록 변환 측 변경 사항을 리팩터링(Refactor)합니다.

  • conversion/base.py: _set_vocab_carbon 추가 — 독립적이며, trust_remote_code=True와 함께 로드되어 HybridDNATokenizer의 병합된 Qwen3 + DNA 어휘(vocab)를 볼 수 있게 하며, tokenizer.ggml.pre = "carbon"을 직접 작성합니다.
  • conversion/llama.py: tokenizer_config.json["tokenizer_class"] == "HybridDNATokenizer"인 경우 LlamaModel.set_vocab에서 분기하여 _set_vocab_carbon으로 디스패치(dispatch)합니다. 이는 conversion/bert.py (BertTokenizer / RobertaTokenizer 간의 tokenizer_class 분기) 및 conversion/phi.py와 동일한 선례를 따릅니다.
  • conversion/base.py: get_vocab_base의 조건문과 자동 생성된 get_vocab_base_pre의 클래스 이름 단락(short-circuit)을 되돌립니다(revert).

tests : 모델 카드(model-card) 예시를 포함하여 ggml-vocab-carbon.gguf 피스처(fixtures) 확장

기존의 엣지 케이스(edge coverage)에 Carbon-3B 모델 카드의 6가지 사례를 추가합니다: 종료되지 않은 기본 완성(basic-completion) 프롬프트, 닫힌 33-bp 예시, 메타데이터 조건부 프롬프트 (<vertebrate_mammalian> 및 <protein_coding_region>이 포함되어 있으며, 어휘(vocab)에 없으므로 BPE 분해됨), 태그가 없는 생(raw) DNA라는 문서화된 안티 패턴(anti-pattern), 그리고 두 가지 가능도 점수(likelihood-scoring) 예시입니다. 이로써 테스트 스위트(suite)는 총 19개 사례로 늘어납니다.

vocab : HybridDNATokenizer를 자체적인 LLAMA_VOCAB_TYPE으로 승격

업스트림 리뷰(upstream review)에 따라 리팩터링(Refactor): 이는 gpt2가 아닌 carbonhybriddna와 같은 자체적인 토크나이저 모델이어야 하며, carbon 프리토크나이저(pre-tokenizer)가 아니어야 합니다. 그렇게 함으로써 향후 변경될 경우를 대비해 올바른 프리토크나이저를 유지할 수 있습니다.

이전에는 토크나이저(tokenizer)가 LLAMA_VOCAB_TYPE_BPE에 새로운 LLAMA_VOCAB_PRE_TYPE_CARBON이 추가된 형태로 모델링되었습니다. 이는 (a) llm_tokenizer_bpe_session::tokenize 내부에 CARBON 전용 분기(branch)를 생성하였고(기존의 pre-type들은 정규식만 다를 뿐 디스패치 로직은 동일함), (b) "하이브리드 DNA 토큰화 (hybrid DNA tokenization)"와 "Qwen3 BPE 프리토크나이저 (pre-tokenizer)"를 혼동하여 처리했습니다. 이번 변경을 통해 이를 PLAMO2와 동등한 별도의 보카(vocab) 타입으로 이동시키며, GGUF 모델 이름은 HF 토크나이저 클래스(HybridDNATokenizer)와 일치하도록 합니다.

include/llama.h: 새로운 LLAMA_VOCAB_TYPE_HYBRIDDNA = 7 추가.
src/llama-vocab.cpp: 새로운 llm_tokenizer_hybriddna + 세션 추가. 이 세션은 비텍스트(non-text)를 위해 std::unique_ptr<llm_tokenizer_bpe>를 소유하며, 원시 텍스트(raw text)를 DNA 인식 분할기(DNA-aware splitter)를 통해 라우팅합니다. 이는 init_tokenizer, tokenize, type_name, byte_to_token, 그리고 BPE 스타일의 token_to_piece 케이스(DNA k-mers + //는 순수 ASCII이므로 바이트 수준의 BPE 디코딩이 이를 처리함)에 연결되었습니다. LLAMA_VOCAB_TYPE_HYBRIDDNA는 SPM/WPM/UGM/RWKV와 함께 보카 타입 설정 블록 내에 자체 분기를 가지며, 여기서 pre_type은 QWEN2로 설정되고 그에 맞는 add_space_prefix / escape_whitespaces / clean_spaces 플래그가 적용됩니다. 이는 qwen2의 BPE 경로를 미러링하여, 비DNA 텍스트에 대한 바이트 수준의 BPE 병합(merging)이 Python 참조 구현과 비트 단위로 동일하게 유지되도록 합니다.
src/llama-vocab.h: 수명이 짧았던 LLAMA_VOCAB_PRE_TYPE_CARBON을 제거합니다.
conversion/base.py: _set_vocab_hybriddna가 tokenizer.ggml.model = "hybriddna"를 작성합니다 (별도의 pre 없음).
conversion/llama.py: bert.py / phi.py와 동일하게 tokenizer_class == "HybridDNATokenizer"를 기준으로 디스패치(dispatch)합니다.
models/ggml-vocab-hybriddna.gguf{,.inp,.out}: 피스처(fixture) 이름 변경 및 메타데이터 재생성.
convert_hf_to_gguf_update.py: 오래된 chkhsh 항목과 trust_remote_code 특수 케이스를 제거합니다 (이제 디스패치가 chkhsh가 아닌 클래스 이름 기반으로 이루어지므로 더 이상 필요하지 않음).

HuggingFaceBio/Carbon-{500M,3B,8B}를 대상으로 엔드 투 엔드 (end-to-end) 검증 완료: 19개의 모든 테스트 픽스처 (test fixtures) 및 모델 카드 메타데이터 조건부 프롬프트에 대해 토큰화 (tokenization) 결과가 Python HybridDNATokenizer와 비트 단위로 동일함 (bit-identical); 탐욕적 생성 (greedy completion) 시 Python 참조 모델과 동일한 DNA 연속 서열을 생성함; 500M를 8B의 초안 (draft)으로 사용하는 스펙 디코딩 (spec-dec)이 여전히 작동함.

vocab : HYBRIDDNA를 허용하도록 llm_tokenizer_bpe assert 완화
vocab : llm_tokenizer_bpe vocab-type assert 제거
vocab : HYBRIDDNA를 위한 tokenizer.ggml.pre 작성, BPE 디스패치 (dispatch) 공유
vocab : PRETOKENIZERDEBUG와 함께 #endif 주석 추가
vocab : 로컬 hybriddna 픽스처 제거 (ggml-org/vocabs로 이동)
deduplicate simplify simplify
Co-authored-by: Sigbjørn Skjæret sigbjorn.skjaeret@scala.com
macOS/iOS: macOS Apple Silicon (arm64), macOS Apple Silicon (arm64, KleidiAI 활성화), macOS Intel (x64), iOS XCFramework
Linux: Ubuntu x64 (CPU), Ubuntu arm64 (CPU), Ubuntu s390x (CPU), Ubuntu x64 (Vulkan), Ubuntu arm64 (Vulkan), Ubuntu x64 (ROCm 7.2), Ubuntu x64 (OpenVINO), Ubuntu x64 (SYCL FP32), Ubuntu x64 (SYCL FP16)
Android: Android arm64 (CPU)
Windows: Windows x64 (CPU), Windows arm64 (CPU), Windows x64 (CUDA 12) - CUDA 12.4 DLLs, Windows x64 (CUDA 13) - CUDA 13.1 DLLs, Windows x64 (Vulkan), Windows x64 (SYCL), Windows x64 (HIP)
openEuler: openEuler x86 (310p), openEuler x86 (910b, ACL Graph), openEuler aarch64 (310p), openEuler aarch64 (910b, ACL Graph)

AI 자동 생성 콘텐츠

본 콘텐츠는 llama.cpp Releases의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0