FHD(1920x1080) 입출력 및 채널 관련 성능 최적화 문의

Product & Environment

항목
Product MLA100 MXM (Aries chip), PCIe Gen4 x8, 단일 디바이스
Runtime Version qbruntime aries2-v4 v1.3.2
Compiler Version qbcompiler v1.2.0
Driver Version Aries 1.13.0
OS Ubuntu, kernel 5.15.0-139-generic

Description

  1. 1920x1080x3 입출력 모델에 레퍼런스 성능이나 런타임 최적화 가이드가 있는지, 그 밖에 고해상도 입력 모델에 권장하는 컴파일 옵션이나 설계 가이드가 있습니까?
    → 하드웨어 친화적인 채널 수 / 커널 크기, downsampling 시점, skip connection 처리 방식 등의 방법이 있다면 확인하고자 합니다.
    → 테스트 중인 모델(int8)을 아래 조건으로 돌려 FHD 입력 기준 6.31 fps 수준입니다.

    항목
    core_mode global8
    pipeline async
    threads 4개 (워커 2 + 입력/출력 호스트 각 1)
    처리량 6.31 fps
  2. 인코더가 3가지 스케일(1080x1920 / 540x960 / 270x480)에 대해 base_channel × 1 / × 2 / × 4 채널을 가지는 구조인데, base_channel 을 줄여가며 측정한 결과입니다.

    base_channel 단계별 채널 (×1 / ×2 / ×4) NPU latency 변화
    32 (기준) 32 / 64 / 128
    24 24 / 48 / 96 거의 없음
    16 16 / 32 / 64 약 -8%

    채널을 절반(32→16)으로 줄였는데도 감소폭이 -8% 정도로 거의 차이가 없는 것을 확인했습니다.

  3. 컴파일된 모델 구조를 mblt-mxqtool show 로 확인해 본 결과

    구분 Original Shape Reshaped Shape Shape
    입력 [1080, 1920, 3] [1080, 1920, 3] [1080, 1920, 64]
    출력 [1080, 1920, 3] [1080, 92, 63] [1080, 92, 64]

    입력은 채널을 64로 올림하는 방식이고, 출력은 값을 63개씩 묶어(92묶음) 64로 패딩? 변환?하는 것으로 보입니다. 하드웨어 내 데이터를 정렬하는 규칙이 텐서의 역할(입력/hidden/출력)이나 shape 에 따라 달라지는지 궁금합니다. 고정된 크기로 설정되는 거라면, 단위를 32 등으로 줄이는 컴파일 옵션이나 조건이 있습니까?

  4. mblt-mxqtool 은 입출력 경계만 보여주는데, MBLT Netron에서 보이는 입출력 쉐입과 어떤 차이가 있는지도 궁금합니다.

  5. Aries 칩의 실제 대역폭을 어느 정도로 생각하면 될지도 궁금합니다.

Logs & Attachments

# 테스트 모델 확인
$ mblt-mxqtool show deblur_xl.mxq
MXQ Version:                0x70000
Compiler Version:           1.2.0.0
Target Hardware:            Aries2
Metadata #0:                
  Filepath:                 /tmp/mxq_rv9f78ty/model_meta0.bin
  Size:                     12126
BUNDLE #0:                  
  Inference Scenario:       Normal
  Cores:                    
    Single:                 0x10001
    Multi:                  0x1fffe, 0x10001, 0x10002, 0x10003, 0x10004
    Global4:                0x10001, 0x10002, 0x10003, 0x10004, 0x1fffe
    Global8:                0x10001, 0x10002, 0x10003, 0x10004, 0x1fffe
                            0x20001, 0x20002, 0x20003, 0x20004, 0x2fffe
  Input Section #0:         (uniform scale, symmetric)
    Name:                   x_0
    IO Type:                Normal
    User DataType:          Float32, Float16, Int8
    NPU DataType:           Int8
    Original Shape:         [1080, 1920, 3]
    Reshaped Shape:         [1080, 1920, 3]
    Shape:                  [1080, 1920, 64]
    Index (SeqLen):         [-1, -1, -1]
    Max Batch Data Size:    0
  Output Section #0:        (ch-wise scale, symmetric)
    Name:                   add_52
    IO Type:                Normal
    User DataType:          Float32, Float16, Int8
    NPU DataType:           Int8
    Original Shape:         [1080, 1920, 3]
    Reshaped Shape:         [1080, 92, 63]
    Shape:                  [1080, 92, 64]
    Index (SeqLen):         [-1, -1, -1]
    Max Batch Data Size:    0
  RMEM IDs:                 
    RMEM ID #0:             
      Rmem Type:            InputActivationOffset
      ID:                   0
      Multiplier (SeqLen):  1.000000
      Bias (SeqLen):        0.000000
    RMEM ID #1:             
      Rmem Type:            OutputActivationOffset
      ID:                   1
      Multiplier (SeqLen):  1.000000
      Bias (SeqLen):        0.000000
  Cache Designations:       (size = 0)
  Section Binaries:         (size = 102)
# FHD 입력에 대한 테스트 결과 trace.json, 앞 3프레임은 warmup, 통계는 뒤 32개 기준, warmup이후 초반 2프레임 발췌
[
  {"name":"reposition input","cat":"","ph":"B","pid":52595,"tid":52651,"ts":5543532197},
  {"name":"scale input","cat":"","ph":"B","pid":52595,"tid":52651,"ts":5543532199},
  {"name":"scale input","cat":"","ph":"E","pid":52595,"tid":52651,"ts":5543534675},
  {"name":"reposition input","cat":"","ph":"E","pid":52595,"tid":52651,"ts":5543534688},
  {"name":"copy to npu","cat":"","ph":"B","pid":52595,"tid":52647,"ts":5543535843},
  {"name":"write device","cat":"","ph":"B","pid":52595,"tid":52647,"ts":5543535845},
  {"name":"write device","cat":"","ph":"E","pid":52595,"tid":52647,"ts":5543538402},
  {"name":"copy to npu","cat":"","ph":"E","pid":52595,"tid":52647,"ts":5543538403},
  {"name":"lock core","cat":"","ph":"B","pid":52595,"tid":52647,"ts":5543538404},
  {"name":"lock core","cat":"","ph":"E","pid":52595,"tid":52647,"ts":5543538410},
  {"name":"init rmem","cat":"","ph":"B","pid":52595,"tid":52647,"ts":5543538412},
  {"name":"update initstart rmem","cat":"","ph":"B","pid":52595,"tid":52647,"ts":5543538414},
  {"name":"update initstart rmem","cat":"","ph":"E","pid":52595,"tid":52647,"ts":5543538420},
  {"name":"init rmem","cat":"","ph":"E","pid":52595,"tid":52647,"ts":5543538420},
  {"name":"copy npu binary","cat":"","ph":"B","pid":52595,"tid":52647,"ts":5543538421},
  {"name":"write device","cat":"","ph":"B","pid":52595,"tid":52647,"ts":5543538422},
  {"name":"write device","cat":"","ph":"E","pid":52595,"tid":52647,"ts":5543538424},
  {"name":"write device","cat":"","ph":"B","pid":52595,"tid":52647,"ts":5543538426},
  {"name":"write device","cat":"","ph":"E","pid":52595,"tid":52647,"ts":5543538428},
  {"name":"copy npu binary","cat":"","ph":"E","pid":52595,"tid":52647,"ts":5543538429},
  {"name":"run npu","cat":"","ph":"B","pid":52595,"tid":52647,"ts":5543538429},
  {"name":"wait core","cat":"","ph":"B","pid":52595,"tid":52647,"ts":5543538433},
  {"name":"reposition input","cat":"","ph":"B","pid":52595,"tid":52651,"ts":5543572413},
  {"name":"scale input","cat":"","ph":"B","pid":52595,"tid":52651,"ts":5543572415},
  {"name":"scale input","cat":"","ph":"E","pid":52595,"tid":52651,"ts":5543573549},
  {"name":"reposition input","cat":"","ph":"E","pid":52595,"tid":52651,"ts":5543573550},
  {"name":"copy to npu","cat":"","ph":"B","pid":52595,"tid":52648,"ts":5543574375},
  {"name":"write device","cat":"","ph":"B","pid":52595,"tid":52648,"ts":5543574377},
  {"name":"write device","cat":"","ph":"E","pid":52595,"tid":52648,"ts":5543579352},
  {"name":"copy to npu","cat":"","ph":"E","pid":52595,"tid":52648,"ts":5543579352},
  {"name":"lock core","cat":"","ph":"B","pid":52595,"tid":52648,"ts":5543579353},
  {"name":"wait core","cat":"","ph":"E","pid":52595,"tid":52647,"ts":5543696454},
  {"name":"run npu","cat":"","ph":"E","pid":52595,"tid":52647,"ts":5543696459},
  {"name":"unlock core","cat":"","ph":"B","pid":52595,"tid":52647,"ts":5543696487},
  {"name":"unlock core","cat":"","ph":"E","pid":52595,"tid":52647,"ts":5543696496},
  {"name":"copy from npu","cat":"","ph":"B","pid":52595,"tid":52647,"ts":5543696502},
  {"name":"read device","cat":"","ph":"B","pid":52595,"tid":52647,"ts":5543696507},
  {"name":"lock core","cat":"","ph":"E","pid":52595,"tid":52648,"ts":5543696517},
  {"name":"init rmem","cat":"","ph":"B","pid":52595,"tid":52648,"ts":5543696526},
  {"name":"write device","cat":"","ph":"B","pid":52595,"tid":52648,"ts":5543696540},
  {"name":"write device","cat":"","ph":"E","pid":52595,"tid":52648,"ts":5543696563},
  {"name":"write device","cat":"","ph":"B","pid":52595,"tid":52648,"ts":5543696566},
  {"name":"write device","cat":"","ph":"E","pid":52595,"tid":52648,"ts":5543696570},
  {"name":"init rmem","cat":"","ph":"E","pid":52595,"tid":52648,"ts":5543696571},
  {"name":"run npu","cat":"","ph":"B","pid":52595,"tid":52648,"ts":5543696574},
  {"name":"wait core","cat":"","ph":"B","pid":52595,"tid":52648,"ts":5543696590},
  {"name":"read device","cat":"","ph":"E","pid":52595,"tid":52647,"ts":5543697760},
  {"name":"copy from npu","cat":"","ph":"E","pid":52595,"tid":52647,"ts":5543697765},
  {"name":"reposition output","cat":"","ph":"B","pid":52595,"tid":52652,"ts":5543697873},
  {"name":"reposition acc output","cat":"","ph":"B","pid":52595,"tid":52652,"ts":5543697894},
  {"name":"reposition acc output","cat":"","ph":"E","pid":52595,"tid":52652,"ts":5543705262},
  {"name":"scale output","cat":"","ph":"B","pid":52595,"tid":52652,"ts":5543705268},
  {"name":"scale output","cat":"","ph":"E","pid":52595,"tid":52652,"ts":5543711957},
  {"name":"reposition output","cat":"","ph":"E","pid":52595,"tid":52652,"ts":5543711959}
]

안녕하세요 vndiwodl22님

아래 문의에 대한 답변 드립니다.

1. 고해상도 입력 모델에 권장하는 컴파일 옵션이나 설계 가이드 문의

고해상도 모델일 수록 Global8모드를 쓰는걸 권장 드립니다.
하드웨어 관점에서는 동일 연산량 기준으로 채널은 64의 배수로 구성하시고, 커널은 1을 초과하는 크기를 사용하시는 것이 연산 효율 면에서 더 유리합니다.

(채널 수는 하드웨어 리소스를 보다 효율적으로 활용할 수 있는 참고 기준 정도로 이해해 주시면 좋을 것 같습니다.)

다만 downsampling 시점이나 skip connection 처리 방식은 모델 구조마다 상이하여, 별도로 권장하는 가이드는 있지 않습니다.

2. base_channel 줄였음에도 변화가 적은 이유

앞서 말씀드린 채널 구성 관련 특성과 연관된 결과로 보입니다.

내부적으로 가능한 경우에는 채널에 최적화가 적용되지만,
구조적으로 최적화가 어려운 경우에는 채널을 줄이더라도 감소 효과가 크지 않을 수 있습니다.

3. 채널 크기 조정 옵션 관련 문의

같은 맥락에서, 현재 64 채널 단위로 구성하실 때 가장 효율적으로 동작한다고 보시면 됩니다.
그 이하 채널에서도 최적화되는 경우가 있지만, 이를 위한 별도의 옵션은 따로 구분되어 있지 않습니다.

5. Aries 칩의 실제 대역폭 문의

이론적인 대역폭은 66GB/s입니다.

다만 일반적인 DRAM 특성상 접근 구역의 겹침, NoC의 최적 크기 등에 따라 크게 달라질 수 있습니다.
통상적으로는 이론치의 80% 수준을 최대치로 보고 있으나, 이 역시 경우에 따라 편차가 큰 편입니다.

추가 문의 사항 있으시면 언제든 말씀 주세요.
감사합니다.

1 Like

vndiwodl22님 안녕하세요? 모빌린트 임범수입니다.

  1. 기본적으로 mblt 파일은 원본 모델을 파싱한 것으로, 이 파싱 결과의 input/output shape이 mxq의 input/output shape으로 사용되게 됩니다. (특정 옵션 혹은 양자화 최적화를 위해 컴파일 과정에서 변경되는 경우도 있습니다.)

위 질문들과 별개로, 현재 FHD 해상도의 이미지 추론의 경우 기본 infer 함수보다 asyncInfer 함수를 사용하시는 것을 추천드립니다. FHD 해상도 이미지면 Host PC에서 해당 이미지 데이터를 NPU를 위한 tensor로 변환하는 것도 꽤나 연산 부하와 latency가 있기 때문에, asyncInfer를 쓰시면 이 Host CPU 작업과 NPU 작업이 async로 진행될 수 있기 때문에 FPS를 더 높이실 수 있을 것이라 기대합니다.

또한, 만약 사용중이신 AI 모델의 input이 float이고, 전처리를 통해 Raw RGB int8 → float으로 변환중이시라면 자사 컴파일러의 fuse normalization layer 기능을 사용하시면 Raw RGB를 float 변환 없이 input으로 사용하실 수 있어 성능적인 이득을 보실 수 있습니다. 자세한 내용은 공식 문서를 참고 부탁드립니다.

2 Likes

답변 감사합니다.

추가적으로 궁금한 사항이 있습니다.

Model Zoo에서 제공하는 레퍼런스 성능표(mblt_model_zoo/vision/README.md)를 확인해봤는데, 각 모델의 정확도(NPU/GPU mAP·Top-1), FLOPs, params는 정리되어 있지만 추론 속도(latency / FPS)에 대한 수치는 표에 없는 것 같습니다.

  • 비전 모델(예: YOLO 계열)에 대해 NPU 기준 latency 또는 FPS 레퍼런스가 별도로 공개된 자료가 있는지 궁금합니다.
  • 있다면 어떤 조건(core-mode: single/multi/global4/global8, batch, async 여부, 전처리·후처리 포함 여부)에서 측정된 값인지도 함께 알고 싶습니다.

FHD(1920×1080) 입력에 대해 async로 추론 시, 모델 자체가 아주 큰 편은 아닌데도 나오는 속도(측정값: 6.3 FPS/ 약 170ms)가 적정선인지 판단할 기준이 없어서 문의드립니다. 동일/유사 모델의 레퍼런스 수치가 있으면 제 구성이 정상 범위인지, 개선 여지가 있는지 가늠할 수 있을 것 같습니다.

감사합니다.

안녕하세요, 모빌린트 박진만입니다.

속도 벤치마크의 경우 현재 공개 준비 단계에 있습니다.
대부분의 딥러닝 모델의 경우 Host PC 환경에 따라 전/후처리에 소요되는 시간에 차이가 있고, 이로 인해서 NPU상에서의 연산 속도와 실제 체감되는 성능간의 차이가 있다보니 속도 공개에는 비교적 신중히 접근할 수 밖에 없었습니다. 공개 지연으로 인해 불편을 드려 죄송합니다.
당장 NPU 속도만 비교하시는 경우라면 저희 유틸리티 툴(Utility Usage — Mobilint SDK qb Runtime Library documentation)에 포함된 mobilint-cli benchmark를 사용하시는 것을 추천드립니다.
컴파일 된 mxq 파일에 대해 mobilint-cli benchmark 명령어와 함께 모델 파일 경로, core mode, batch, thread 수 등을 바꿔가면서 테스트하시면 각 세팅에서 NPU 연산 성능의 최고치의 대략적인 값을 확인할 수 있습니다.
YOLO의 후처리 포함 여부 역시 컴파일 단계에서 서로 다른 방식으로 컴파일해서 비교하신다면 손쉽게 확인하실 수 있을 것으로 보입니다.

추가로 도움이 필요하신 경우 편히 문의 남겨주시기 바랍니다.
감사합니다.

3 Likes