본문으로 건너뛰기

Neat Library 릴리스 노트

SiMa.ai Neat Library의 릴리스 노트입니다.

0.6.1(미출시)​

호환성에 영향을 주는 변경​

  • Neat Library C++ ABI는 이제 7(libsima_neat.so.7)입니다. ResizeSpec, PreprocessOptions, PreprocOptions, NormalizationOptions에 필드가 추가되었습니다. 일치하는 헤더와 런타임 패키지로 C++ 애플리케이션, 플러그인, Python 바인딩을 다시 빌드하세요. ABI 6 바이너리를 재사용하거나 호환성 심볼릭 링크를 추가하지 마세요.

전처리​

  • Model 전처리와 독립형 Resize는 ResizeInterpolation을 공유합니다. 새 코드에서는 샘플러 문자열 대신 preprocess.resize.interpolation = ResizeInterpolation.BilinearAntialiased를 사용하세요. 기존 scaling_type 문자열의 호환성은 유지되며 충돌하는 기본값 이외의 문자열은 거부됩니다.

  • 기존 전처리 옵션에서 안티앨리어싱 이중선형 크기 조정, 명시적인 원본 재조정 계수, 색 변환 위치, 부동소수점 변환 정책을 지정할 수 있습니다. 고정 원본 산술 경로에서는 평균과 표준편차 필드가 합성된 아핀 변환 대신 원래 평균과 제수를 유지합니다. BF16은 기존 절삭이 기본이며 최근접 짝수 반올림은 명시적으로 선택합니다. FP16은 최근접 짝수 반올림을 사용합니다. 정밀 INT8 양자화에는 모델의 승수와 일치하는 원본 스텝이 필요하며, 승수로 이 스텝을 복원할 수 없습니다. 새 옵션을 지정하지 않으면 기존 경로를 유지합니다. Preproc를 참조하세요.

0.6.0​

호환성이 깨지는 변경 사항​

  • 텐서 모드의 Model::input_specs()는 이제 크기 1인 배치 축([1,H,W,C])을 포함해 MPK에 정의된 랭크를 유지합니다. 시드 입력 없이 build()를 호출한 뒤에도 배치 1의 HWC 입력을 계속 허용합니다. compiled_batch_size()는 텐서 차원에서 추론하는 대신 MLA에 선언된 배치 크기를 읽습니다.

  • 모델 출력은 이제 중간 장치 형상 대신 MPK에 작성된 최종 논리 형상과 레이아웃을 제공합니다. 예를 들어 ResNet-50의 배치 평탄화 출력은 4차원 HWC 형상 대신 [1, 1000] 형상과 알 수 없는 논리 레이아웃을 가집니다. Float32 텐서 형식은 FP32 대신 EVXX_FLOAT32일 수 있습니다. 값은 텐서의 dtype과 형상으로 해석하며 백엔드 형식 태그에서 논리 축을 추론하지 않습니다.

  • Neat Library C++ ABI는 이제 버전 6이며, 공유 라이브러리의 SONAME은 libsima_neat.so.6입니다. 텐서는 이제 특징 추출기의 의미 메타데이터를 포함하고, 공개 GenAI 요청/결과 유형은 ASR 작업, 언어 및 프로브 메타데이터를 포함하며, GraphLinkOptions에는 실시간 허용 한도가 포함되며, BenchmarkOptions와 BenchmarkReport에 필드가 추가되었습니다. C++ 애플리케이션과 플러그인을 다시 빌드하고 해당 Core 런타임 및 개발 패키지를 설치합니다. SimaArgMaxOptions에 axis와 keepdims가 추가되었으며, SimaArgMax 클래스 레이아웃도 변경되었습니다.

  • 실시간 그래프 구성은 이제 GraphLinkOptions, Graph::connect() 및 Graph::build()를 사용합니다. 미리보기 API인 RealtimeGraphLinkOptions, connect_realtime(), build_fused_realtime_sources() / build_fused_realtime_source() 및 RealtimeEveryFrameByStream은 제거되었습니다. realtime_every_frame_by_stream을 포함하는 저장된 그래프는 지원되는 정책으로 다시 생성해야 합니다. 자세한 내용은 라이브 프래그먼트 연결을 참조하십시오.

  • 패키지 버전은 0.6.0입니다. Model::Options와 BoxDecodeOptions에 yolox_seg_pose.pose_classes가 추가되었으며, 이러한 공개 레이아웃 추가에는 ABI 6을 사용하는 구성 요소가 필요합니다. ABI 호환성 심볼릭 링크를 사용하지 마십시오. GraphOptions에는 kernel_runner_a65_workers가 추가되었습니다. 0.6.0으로 업데이트할 때는 일치하는 런타임 및 개발 패키지에 맞춰 애플리케이션, 플러그인, Python 확장을 다시 빌드하십시오. 둘 다 ABI 6을 사용한다는 이유만으로 프리뷰 바이너리와 정식 릴리스 패키지를 혼합하지 마십시오.

런타임 변경 사항​

  • Model::benchmark()는 전력 레일을 직접 샘플링하는 대신 Sentinel에서 보드 텔레메트리를 읽습니다. 이제 지연 시간 패스와 처리량 패스는 각각 num_samples개의 입력을 측정하고 최소 BenchmarkOptions::min_duration_ms(기본값 10초)가 경과할 때까지 실행되므로, 전력 및 온도 측정값이 여러 Sentinel 샘플에 걸쳐 수집됩니다. 이전의 입력 개수 기반 측정을 사용하려면 min_duration_ms를 0으로 설정하십시오. BenchmarkReport에는 latency_p50_ms, latency_p95_ms, latency_p99_ms, peak_power_watts, throughput_samples, throughput_duration_ms, 그리고 레일 전력, 다이 및 보드 온도, 전체 및 코어별 CPU 사용률, MLA·EV74 메모리와 보드 전체 Linux 메모리를 포함하는 telemetry가 추가되었습니다. avg_power_watts와 energy_joules의 의미는 그대로이며, energy_joules는 num_samples개 입력에 대한 에너지입니다. Sentinel을 사용할 수 없는 경우에도 지연 시간과 FPS는 보고되며, telemetry.status에 그 이유가 표시됩니다. DevKit 설치 프로그램은 sima-cli neat install sentinel로 Sentinel을 설치하며, 실행 중인 버전이 최신 프로덕션 빌드가 아니면 업그레이드합니다. 자세한 내용은 모델 실행 측정을 참조하십시오.

  • enable_board_power()로 활성화하는 Run 전력 텔레메트리도 Sentinel에서 읽습니다. Core가 더 이상 I2C 전력 모니터를 열지 않으므로 같은 레일에 대한 Sentinel의 읽기와 간섭하지 않으며, 설치 프로그램도 더 이상 sima를 i2c 그룹에 추가하지 않습니다. Sentinel은 2초마다 샘플링하므로 약 2초보다 짧은 측정 창에는 전력 샘플이 없을 수 있습니다. 레일 이름은 mla처럼 Sentinel 메트릭 이름을 따르며 전력만 보고합니다. sample_interval_ms, PowerMonitorProfile, 기본 제공 레일 테이블, PowerRailConfig의 I2C 필드, enable_modalix_som_power(), enable_modalix_dvt_power(), modalix_som_power_monitor_options() / modalix_dvt_power_monitor_options()는 더 이상 사용되지 않으며 무시됩니다.

  • TelemetryMonitor는 C++ 및 Python에서 start()와 stop() 사이의 보드 전력, 온도, CPU 사용률, 메모리를 Sentinel에서 기록합니다. read()는 지금까지의 요약을 반환하며, Telemetry는 YAML로 출력되고 YAML 또는 JSON으로 저장됩니다. Model::benchmark()는 BenchmarkReport::telemetry에 이를 사용합니다. PowerMonitor, read_power_snapshot(), RunOptions::enable_board_power(), RunOptions::power_monitor, MeasureOptions::include_power는 더 이상 사용되지 않고 TelemetryMonitor로 대체되며, 계속 동작합니다. 자세한 내용은 보드 텔레메트리 기록을 참조하십시오.

  • BenchmarkOptions::inputs를 사용하면 합성 입력 대신 직접 준비한 텐서로 Model::benchmark()를 실행할 수 있으며, BenchmarkReport::input에 사용된 입력이 기록됩니다. 직접 준비한 입력으로 측정을 참조하십시오.

  • 플러그인 지연 시간은 더 이상 사용되지 않으며 제거될 예정입니다. 대상은 MeasureOptions::include_plugin_latency 및 plugin_latency_source, BenchmarkOptions::include_plugin_latency, start_measurement(bool), Model::benchmark(int, bool) / Model::benchmark(bool)입니다. 대신 start_measurement()와 benchmark(num_samples)를 사용하세요.

  • 하드웨어 디코딩은 직접 코덱 세션과 DMA-BUF 출력을 사용합니다. Core는 더 이상 디코더 데몬 승인 임대나 SIMA_DECODER_ADMISSION_REQUIRE를 사용하지 않습니다. 디코더 풀 및 튜닝 옵션은 유지됩니다.

  • C++ 및 Python에서 SimaDecode 및 RtspDecodedInput을 통해 기본 H.265/HEVC 디코딩을 사용할 수 있습니다. RtspEncodedInput는 디코딩하지 않고 파싱된 H.265 액세스 유닛을 제공합니다. H.265 입력은 HEVC Main 프로필, 8비트, 4:2:0을 사용해야 합니다. 코덱 선택기는 H265 및 HEVC를 모두 허용합니다. H.264 선택기는 AVC도 허용합니다. FormatTag / pyneat.Format은 인코딩된 그래프 경계에서 동일한 별칭을 허용하며, 여전히 H264 및 H265로 직렬화됩니다.

  • VideoSender은 VideoSenderOptions::Passthrough(codec) / pyneat.VideoSenderOptions.passthrough(codec)를 통해 재인코딩 없이 UDP를 통해 RTP로 인코딩된 H.264 또는 H.265를 전달합니다. H.265는 기본적으로 RTP 페이로드 유형 98을 사용하고, H.264는 96을 유지합니다. H264RtpUdpFromEncoded()은 Passthrough(RtspCodec::H264)로 대체되어 더 이상 사용되지 않습니다.

  • 원시 VideoSender 입력은 이제 호환되는 DMA 기반 NV12이고 설치된 인코더가 input-layout-aware=true를 알릴 때 형식 변환을 자동으로 생략합니다. 기존 인코더 입력 경계는 다른 원시 입력을 최종 인코더 저장에 준비합니다. H264RtpUdpFromRaw(...) C++ 및 Python API는 변경되지 않습니다.

  • InputMemoryPolicy::Auto는 선호 할당과 필수 입력 저장을 구분합니다. 장치 선호 경로는 호출자 소유 Tensor와 Sample 저장을 CPU 이미지로 변환하지 않고 유지합니다. 호환 DMA-BUF 입력은 제로카피이며 기존 CPU 입력은 장치 입력 경계에서 실체화가 필요할 수 있습니다. 명시적 EV74/DMS0 입력 요구사항은 계속 적용됩니다.

  • RTSP 입력은 RtspEncodedInputOptions와 RtspDecodedInputOptions의 코덱 중립적인 단일 payload_type 필드로 RTP 페이로드 유형을 선택합니다. -1은 코덱 기본값(H.264/H.265의 경우 96, MJPEG의 경우 26)을 선택하고, 0은 페이로드 필터링을 비활성화하며, 양수 값은 지정한 페이로드를 선택합니다. RtspEncodedInputOptions::h264_payload_type 및 mjpeg_payload_type는 더 이상 사용되지 않으며, 해석된 페이로드를 변경하는 경우 런타임에서 한 번 경고합니다.

  • 일반적인 build()는 이제 조건을 충족하는 라이브 팬인에 대해 융합 lowering을 자동으로 선택합니다. 직접 인코딩된 H.264 또는 H.265 VideoSender 분기는 디코딩 전에 융합되며, 디코딩된 프레임을 CPU로 복사하지 않습니다. 소스, 디코더 및 송신자의 코덱이 일치해야 하며, 일치하지 않는 쌍은 별도의 파이프라인 세그먼트에 남습니다. 라이브 미리 보기를 위해 해당 에지를 RealtimeLatestByStream으로 설정하면 느린 비디오 수신기가 디코더 분기에 역압력을 가하는 대신 오래된 액세스 유닛을 새것으로 교체합니다.

  • MIPI/libcamera 소스 소유 그래프에 대한 C++ 및 Python CameraInput 문서와 튜토리얼을 추가했습니다. 여기에는 CVU/MLA 모델 경로 앞의 적응형 SiMaAI 메모리 핸드오프가 포함됩니다.

  • MetadataSender은 이제 더 큰 JSON 메시지를 분할하여 UDP 페이로드를 1200바이트 이내로 유지합니다. 메타데이터 청크 재조합 기능을 포함한 버전으로 Insight를 업데이트하고, 이 Neat Library 버전과 함께 또는 그 전에 업데이트하십시오. 이전 버전의 Insight는 변경되지 않은 JSON 페이로드를 최대 1200바이트까지 계속 지원합니다.

그래프 구성 및 검증​

  • 새 SimaVoxelize, SimaPillarScatter, SimaBEVPoolPlan, SimaBEVPool 노드는 PointPillars와 BEVFusion의 커널 라이브러리 LiDAR 연산과 카메라-BEV 연산을 INT8 또는 BF16 텐서로 A65 또는 EV74에서 실행합니다. 각 노드는 선택한 대상에서 실행되며 대체 실행은 없습니다. LiDAR 및 BEV 커널 노드를 참조하세요.
  • 기본 공개 Input이 한 모델의 이미지 입력에 직접 연결되면 선언된 이미지 형식을 상속합니다. 명시적 입력 옵션은 계속 기준이며 모호한 연결에는 명시적 옵션이 필요합니다. 페이로드 복사 없이 샘플 해석만 변경됩니다.
  • 그래프 구성은 이제 하나의 노드 객체를 하나의 논리적 정점으로 처리합니다. 중복 삽입 및 겹치는 조각 가져오기는 원자적으로 실패하며, 반복적인 connect() 호출은 기존 노드를 재사용하여 분기 처리를 수행합니다.
  • 이제 모든 구체화된 파이프라인 세그먼트는 build() 중에 최종 GStreamer 이름을 검증합니다. 명시적인 validate() 호출은 필요하지 않습니다. 중복되거나 누락된 이름은 misconfig.pipeline_shape와 함께 실패하며, 잘린 파이프라인을 생성하지 않습니다.
  • 사용자 지정 프래그먼트는 이제 모든 명시적 이름을 보고하고, 선언과 함께 이름이 지정된 패드 참조도 변환합니다. 이름 충돌은 자동으로 이름을 바꾸는 대신 거부됩니다.
릴리스호환되는 Palette SDK참고 사항
0.6.13.0.0.1Neat Library 0.6.1
0.6.03.0.0.0Neat Library 0.6.0
0.5.02.1.3.1Neat Library 0.5.0
0.4.02.1.3.0Neat Library 0.4.0
0.3.02.1.2.3Neat Library 0.3.0
0.2.22.1.2.2Neat Library 0.2.2
0.2.12.1.2.1Neat Library 0.2.1
0.2.02.1.2Neat Library 0.2.0
0.1.02.0.0Neat Library 0.1.0