ETRI-TANGO/tango2-sds-vlm-eva
TANGO2 SDS Vision Language Model
선박 및 해양 도메인에 특화된 시각 언어 모델(Vision Language Model, VLM)의 프로젝터와 저순위 적응(Low-Rank Adaptation, LoRA) 가중치 모음이다. 구조는 LLaVA 계열을 따르며, 동결된 비전 인코더의 특징을 프로젝터가 언어 모델의 임베딩 공간으로 옮긴다.
학습과 추론 코드는 ML-TANGO/TANGO2 의 Field_Test/SDS/VisionLanguageModel 에 있다.
구성
CLIP 계열 체크포인트의 비전 인코더는 openai/clip-vit-large-patch14-336 이고 동결 상태이다. Gemma 4 기준선은 계보가 달라 아래에 따로 적는다. 프로젝터는 mlp2x_gelu 이며 이미지 토큰 수는 576 이다. LoRA 는 r=128, lora_alpha=256 이고 대상 모듈은 q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj 이다.
각 디렉토리에는 projector.bin, LoRA 어댑터, 그리고 프로젝터 구조를 기록한 vlm_config.json 이 함께 들어 있다. 추론 경로는 vlm_config.json 을 읽어 프로젝터를 재구성한 뒤 가중치를 적재한다.
체크포인트
Qwen3-8B 계열
Llama-3.1-8B-Instruct 계열
Gemma 4 기준선
google/gemma-4-E4B-it 의 네이티브 멀티모달 구조를 그대로 쓴다. 위의 CLIP 계열과 계보가 다르다. 동결 CLIP 에 직접 구현한 프로젝터를 붙이는 대신, Gemma 4 가 이미 갖고 있는 비전 타워(Gemma4VisionModel, hidden 768, 16 층)와 커넥터(embed_vision, RMSNorm + Linear 768→2560)를 쓴다. 오디오 인코더는 audio_config 를 None 으로 두어 제외했다. 비전 타워는 동결하고 커넥터와 언어 모델 LoRA 를 학습했다.
이 체크포인트에는 projector.bin 과 vlm_config.json 이 없다. 대신 학습된 커넥터가 connector.bin 에, 학습 설정이 gemma4_train_config.json 에 있다. 적재 방법은 해당 디렉토리의 README 에 적었다.
이름 끝의 _9k 는 20260728 데이터셋의 한글 시나리오 9,000건으로 학습했다는 뜻이다. 접미사가 없는 _sds_lora_ko 와 _sds_lora_en 은 그보다 앞선 SDS 데이터셋으로 학습된 별개의 체크포인트이므로 혼동하지 않도록 한다. 이름이 비슷하지만 학습 데이터가 다르다.
20260728 학습 설정과 측정값
CLIP 계열 _9k 두 체크포인트는 같은 데이터, 같은 분할, 같은 하이퍼파라미터로 학습되었다. Gemma 4 기준선은 데이터와 분할, 유효 배치, 학습률 일정, 에포크 수가 같지만 GPU 한 장에서 돌아 per-device 배치와 누적 단계가 다르다.
학습에 쓰지 않은 1,000건에 대한 검증 손실은 다음과 같다.
Gemma 4 기준선의 같은 지점 값은 0.3182, 0.2817, 0.2629, 0.2438, 0.2291, 0.2190, 0.2124, 0.2087, 0.2085 이다.
이 수치가 말하지 않는 것
이 값은 참조 문장에 대한 다음 토큰 예측 손실이다. 생성 품질, 해상상황 묘사의 사실 정확도, COLREG 조항 인용의 타당성, 모델이 이미지에 근거를 두는지 여부는 이 수치로 알 수 없다.
세 계열의 값을 같은 척도로 비교할 수 없다. 서로 다른 토크나이저가 만든 서로 다른 토큰 열에 대한 교차 엔트로피이기 때문이다. 어휘 크기는 Qwen3 가 151,670, Llama3.1 이 128,257, Gemma 4 가 262,144 이다. 또한 두 실행은 이어받은 체크포인트가 다르다. Qwen3 계열은 4 GPU 유효 배치 64 로 855 step 학습된 LLaMarine 어댑터에서, Llama 계열은 6 GPU 유효 배치 96 으로 570 step 학습된 어댑터에서 출발했다.
사용법
hf download ETRI-TANGO/tango2-sds-vlm-eva --local-dir ~/tango2-sds-vlm-evapython test.py \
--projector_path ~/tango2-sds-vlm-eva/clip_qwen3_proj_lora_marine_sds_ko_9k/projector.bin \
--lora_path ~/tango2-sds-vlm-eva/clip_qwen3_proj_lora_marine_sds_ko_9k \
--llm_model Qwen/Qwen3-8B \
--image sea_ship.jpg \
--question "사진을 바탕으로 현재 해상상황을 묘사해줘."프롬프트 형식
_9k 체크포인트는 이미지 한 장과 자동 식별 시스템(Automatic Identification System, AIS) 텍스트를 함께 받는 형식으로 학습되었다. 사용자 메시지는 다음 순서로 구성된다.
<image>
[선박 AIS 정보]
- 자선 (ID:0) | 위도:... 경도:... | 속도:...kt 방향:...° | 선체:...m × ...m 흘수:...m
- 주변선박 (ID:1) | 위도:... 경도:... | 속도:...kt 방향:...° | 선체:...m × ...m 흘수:...m | CPA:...NM TCPA:...초
사진과 AIS 데이터를 바탕으로 현재 해상상황을 묘사하고 COLREG 규칙에 따른 올바른 항해 조력 메시지를 생성해줘.응답은 해상상황 묘사와 항해 조력 메시지를 빈 줄로 이어 붙인 하나의 문단이다.
20260728 데이터셋의 bbox_* 좌표는 이미지와 다른 카메라 기준으로 생성되어 이미지 위의 선박 위치와 일치하지 않는다. 그래서 학습 프롬프트의 AIS 텍스트에서 바운딩박스를 제외했고 추론에서도 같은 형식을 쓴다. 이 문자열을 만드는 코드는 저장소의 scripts/prepare_sds_dataset.py 의 format_ais() 와 demo/app.py 의 _format_ais_df() 에 있다.
라이선스
ETRI TANGO License 를 따른다. 기반 언어 모델인 Qwen/Qwen3-8B 와 meta-llama/Llama-3.1-8B-Instruct 의 라이선스도 함께 적용된다.
