Qbcompiler 1.2.0 버전 이슈에 대해서 질문이 있습니다

Product & Environment

  • Product: qbcompiler 1.2.0
  • OS: ubuntu22.04

Description

안녕하세요. 공식 First Compile 문서를 따라 qbcompiler 1.2.0 CLI로 ONNX 모델을 컴파일하던 중, --target-device regulus-rb를 명시했는데도 내부 콜백 함수에서 target_device 인자가 누락됐다는 오류가 발생하여 문의드립니다.

설치된 코드와 제공받은 wheel 원본을 비교한 결과 관련 파일이 바이트 단위로 일치했고, wheel 원본의 호출부에서도 해당 인자가 전달되지 않는 것으로 확인됩니다. 배포 코드의 알려진 이슈인지, 또는 저희가 놓친 설치·사용 조건이 있는지 확인 부탁드립니다.

1. 사용 환경

항목 값
wheel qbcompiler-1.2.0-py3-none-any.whl
실제 패키지 버전 1.2.0
공식 Docker 기반 이미지 mobilint/qbcompiler:1.2-cuda12.8.1-ubuntu22.04
OS Ubuntu 22.04.5 LTS, x86_64
Python 3.10 계열
PyTorch 2.7.1+cu128
GPU NVIDIA RTX A5000 24GB
NVIDIA 드라이버 580.173.02
입력 모델 YOLOm에서 export한 ONNX
ONNX opset 17, IR 8, 입력 (1, 3, 640, 640)

공식 기반 이미지 안에서 다음 방식으로 wheel을 설치했습니다. 설치 후 패키지 소스는 수정하지 않았습니다.

python -m pip install /path/to/qbcompiler-1.2.0-py3-none-any.whl

참고 문서:

2. 최소 재현 명령과 결과

컨테이너 내부에서 First Compile 예제와 같은 인자 구성으로 실행했습니다. 모델과 출력 파일명만 저희 파일에 맞췄습니다.

python -m qbcompiler compile \
  --model /workspace/best.onnx \
  --backend onnx \
  --target-device regulus-rb \
  --output /workspace/model.mxq

결과는 종료 코드 1이며, MXQ는 생성되지 않았습니다. 오류 내용을 확인하기 위해 동일한 명령에 로그 출력용 환경변수만 설정해 재실행했습니다.

QBCOMPILER_JSONL=1 python -m qbcompiler compile \
  --model /workspace/best.onnx \
  --backend onnx \
  --target-device regulus-rb \
  --output /workspace/model.mxq

실제 오류 로그:

{"type": "error", "code": "INTERNAL_ERROR", "message": "mxq_compile_with_callback_V2() missing 1 required positional argument: 'target_device'", "ts": "2026-09-10T08:42:25Z", "v": 1}

MBLT 파싱 후 MXQ 단계로 넘어갈 때 발생했습니다. 다음 조건에서도 비교했습니다.

조건 결과
--target-device regulus-rb mxq_compile_with_callback_V2()의 target_device 누락
--target-device regulus-ra 동일한 MXQ 콜백 인자 누락
--target-device 생략 더 앞 단계인 mblt_compile_with_callback_V2()의 target_device 누락

생략 시 실제 오류 로그:

{"type": "error", "code": "INTERNAL_ERROR", "message": "mblt_compile_with_callback_V2() missing 1 required positional argument: 'target_device'", "ts": "2026-09-10T08:55:08Z", "v": 1}

3. wheel 원본에서 확인한 코드

아래 줄 번호는 제공받은 1.2.0 wheel 내부 파일 기준입니다. 코드는 관련 부분만 발췌했습니다.

CLI 양자화 호출부: qbcompiler/__main__.py, 303–332행

_invoke_quantize()의 인자 목록에 target_device가 없고, _impl() 호출에도 전달되지 않습니다.

def _invoke_quantize(
        *,
        mblt: str,
        output: str,
        device: Optional[str],
        calib_data_path: Optional[list[str]],
        use_random_calib: Optional[bool],
        config_preset: Optional[str],
        compile_config: Optional[str],
        progress_callback: Callable[[int, str], None],
) -> Optional[_Failure]:
    # 중간 설명문 생략
    from qbcompiler import mxq_compile_with_callback_V2 as _impl

    try:
        _impl(
            model=mblt,
            save_path=output,
            device=device,
            calib_data_path=calib_data_path,
            use_random_calib=use_random_calib,
            config_preset=config_preset,
            compile_config=compile_config,
            progress_callback=progress_callback,
        )
    # 이후 예외 처리 생략

호출받는 함수: qbcompiler/frontend.py, 1179–1191행

반면 콜백 함수에서는 target_device가 기본값 없는 필수 인자로 선언돼 있습니다.

def mxq_compile_with_callback_V2(
    model: str,
    target_device: str,
    save_path: str,
    backend: str = "onnx",
    device: Optional[str] = None,
    calib_data_path: Optional[Union[str, List[str]]] = None,
    use_random_calib: Optional[bool] = None,
    config_preset: Optional[str] = None,
    compile_config: Optional[CompileConfig | str] = None,
    *,
    progress_callback: Callable[[int, str], None],
) -> None:

파싱 경로의 차이

__main__.py의 _invoke_parse()는 276–277행에서 값이 있을 때만 인자를 전달합니다.

if target_device is not None:
    call_kwargs["target_device"] = target_device

그런데 frontend.py의 mblt_compile_with_callback_V2()도 target_device를 필수 인자로 요구합니다. 따라서 옵션 생략 시 파싱 단계부터 실패하는 결과와 부합합니다.

또한 CLI 인자 정의에는 아래와 같이 MBLT 단계 전용이라고 설명되어 있습니다.

p_compile.add_argument(
    "--target-device",
    default=None,
    help="Target Mobilint device (MBLT phase only).",
)

MBLT에 저장된 장치 정보를 MXQ 단계에서 사용하려는 설계인지, 아니면 CLI에서 MXQ 콜백까지 명시적으로 전달해야 하는 설계인지 확인 부탁드립니다.

4. 설치 파일과 wheel 동일성 확인

wheel 압축 무결성 검사에서 오류는 없었습니다. 다음 파일은 wheel 원본과 실제 설치 파일의 SHA-256 및 바이트가 모두 일치했습니다.

파일 일치 여부
qbcompiler/__init__.py 일치
qbcompiler/__main__.py 일치
qbcompiler/frontend.py 일치

wheel SHA-256:

28f276baef1bff86ed313cb819b53d8abb684a7555cf4c81c459edc09abf1b4b

관련 소스 SHA-256 — wheel 원본과 설치 파일 공통:

qbcompiler/__main__.py
ac292187463d8f19a70b7f2fb8fc62f84a6d150c2b41d9e60b7665bb25b0bac9

qbcompiler/frontend.py
984c58d17b66b074d1e1be50dc42be8acdc7286758b4d70b0fb3cf1b4cdaef0c

참고로 별도 제공받은 qbcompiler-1.1.2+aries2-py3-none-any.whl에는 qbcompiler/__main__.py와 같은 콜백 함수명이 없었습니다. 코드 구조가 달라 정적 비교만 했으며, 1.1.2의 실행 성공이나 회귀 여부를 확인한 것은 아닙니다.

5. 확인 요청

  1. 위 1.2.0 wheel에서 _invoke_quantize()가 필수 인자 target_device를 전달하지 않는 것이 알려진 이슈인가요?
  2. 해당 명령이 정상 동작하려면 별도로 필요한 설치 조건이나 공식 설정이 있나요?
  3. 정상 설계는 CLI가 target_device를 끝까지 전달하는 방식인가요, 아니면 MBLT의 장치 정보를 사용하도록 콜백이 인자 생략을 허용하는 방식인가요?
  4. 수정된 wheel/버전이 있다면 다운로드 경로와 대응 Docker 이미지 태그를 안내 부탁드립니다.

Python API 직접 호출에서는 이 인자 누락을 넘어 양자화 단계까지 진행되는 것을 확인했습니다. 이후 모델 연산 관련 오류는 별도 사안으로 구분하고 있으며, 본 문의에서는 CLI의 인자 전달 문제에 대한 확인을 요청드립니다.

감사합니다.

Logs & Attachments

안녕하세요,
모빌린트 박상형입니다.

먼저 이용에 불편을 드린 점 죄송하다는 말씀 드립니다.
문의 주신 내용에 대해 아래와 같이 답변 드리니 참고 부탁드립니다.

  1. 위 1.2.0 wheel에서 _invoke_quantize()가 필수 인자 target_device를 전달하지 않는 것이 알려진 이슈인가요?

    • 네, 저희도 이미 파악하고 있던 이슈고, 신규 버전인 1.3.0에서 수정되었습니다. 1.3.0은 오늘 또는 늦어도 차주 초 공식 다운로드 페이지(https://dl.mobilint.com)를 통해 받으실 수 있도록 준비하고 있습니다.
  2. 해당 명령이 정상 동작하려면 별도로 필요한 설치 조건이나 공식 설정이 있나요?

    • 별도 설치 조건은 없습니다.
  3. 정상 설계는 CLI가 target_device를 끝까지 전달하는 방식인가요, 아니면 MBLT의 장치 정보를 콜백이 재사용하도록 인자 생략을 허용하는 방식인가요?

    • 말씀하신 것처럼 CLI가 target_device를 MXQ 단계까지 끝까지 전달하는 것이 원래 의도된 설계입니다.
  4. 수정된 wheel/버전이 있다면 다운로드 경로와 대응 Docker 이미지 태그를 안내 부탁드립니다.

    • 수정된 버전(1.3.0)은 릴리즈 후, 공식 다운로드 페이지(https://dl.mobilint.com)에서 wheel 파일로 받으실 수 있고,
    • Docker 이미지는 아래 명령으로 받으실 수 있습니다.
      • docker pull mobilint/qbcompiler:1.3-cuda12.8.1-ubuntu22.04

추가로 궁금하신 점 있으시면 언제든지 질문 남겨주시면 감사하겠습니다.

그럼, 감사합니다.