재미와 이익을 위해 텍스트 모델에 비전 기능을 이식하기
요약
llama.cpp 환경에서 텍스트 전용 모델에 비전 기능을 통합하는 실험적인 방법을 다룹니다. Mistral의 Pixtral 인코더를 활용하여 기존 모델의 토크나이저에 포함된 이미지 관련 토큰을 수정함으로써, 모델이 이미지를 올바르게 인식하도록 만드는 과정을 설명합니다.
핵심 포인트
- llama.cpp는 기본적으로 비전 기능을 메인 가중치와 분리하여 처리함
- Pixtral과 같은 비전 인코더를 기존 모델에 결합하여 멀티모달 기능을 구현할 수 있음
- 토크나이저 내의 특수 토큰(예: [IMG_END]) 불일치 문제를 소스 코드 수정이나 모델 변환을 통해 해결 가능함
- Gemma 모델의 사례처럼 토크나이저에 이미 ASR이나 이미지 관련 토큰이 포함된 경우가 있어 이를 활용할 수 있음
우리가 알고 있듯이.. llama.cpp는 비전 (vision) 또는 기타 멀티미디어 기능을 메인 가중치 (weights)와 분리합니다. 반대로, 훈련된 모델의 기능이 출시 시점에 제거될 수도 있습니다.
만약 그것들을 다시 집어넣을 방법이 있다면 어떨까요?
Mistral은 이제 pixtral과 medium 비전 인코더 (vision encoders)를 모두 출시했습니다. 이전 모델들의 토크나이저 (tokenizers)에는 관련 부분들이 포함되어 있습니다.
"10": {
"content": "[IMG]",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
제가 꽤 좋아하는 모델인 Behemoth-X를 예로 들어보겠습니다.
--mmproj Pixtral-Large-Instruct-2411-hf.mmproj-f16.gguf \\
--no-mmproj-offload \\
이 모델은 분명히 이미지를 보고 있습니다.. 하지만 무언가 고장 났습니다.
로그는 다음과 같이 알려줍니다:
[/INST]y'know what??? shut up</s>[INST][IMG_END][/INST]
아마도 [IMG_END]에 대해 훈련되지 않은 것 같습니다. 매우 불행한 일이죠. 하지만 우리에게는 소스 코드가 있으니 mtmd.cpp를 수정할 수 있습니다.
} else if (proj == PROJECTOR_TYPE_PIXTRAL) {
// https://github.com/huggingface/transformers/blob/1cd110c6cb6a6237614130c470e9a902dbc1a4bd/docs/source/en/model_doc/pixtral.md
//img_end = "[IMG_END]";
img_end = "\n";
대안으로, 문제가 되는 토큰을 다른 ID로 변경하기 위해 모델을 다시 변환할 수도 있습니다. 어떤 방식이든, 이제 더 이상 턴 (turn)을 놓치지 않습니다.
https://i.ibb.co/P7x6z31/good-image2.png https://i.ibb.co/Pn29ML2/good-image.png
완벽하냐고요? 아니요. 하지만 devstral2나 여러분이 비전 기능을 원하는 다른 모델에서 더 잘 작동할까요? 그럴 가능성이 매우 높습니다.
31b gemma는 토크나이저에 ASR (자동 음성 인식) 부분을 포함하고 있습니다...
"audio_token": "<|audio|>",
"backend": "tokenizers",
"boa_token": "<|audio>",
"boi_token": "<|image>",
"bos_token": "<bos>",
"eoa_token": "<audio|>",
"eoc_token": "<channel|>",
"eoi_token": "<image|>",
"eos_token": "<eos>",
"eot_token": "<turn|>,"
AI 자동 생성 콘텐츠
본 콘텐츠는 Reddit AI Engineering의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기