Release Notes - 0.6.0

FuriosaAI SDK 0.6.0은 메이저 릴리즈로 성능 개선, 기능 추가, 버그픽스에 대한 234개의 PR과 약 900여개의 커밋을 포함하고 있다.

업그레이드 방법

APT 저장소를 사용하고 있다면 다음과 간단히 업그레이드할 수 있다. 더 자세한 설치 방법은 드라이버, 펌웨어, 런타임 설치 가이드 에서 찾을 수 있다.

apt-get update && \
apt-get install furiosa-driver-pdma furiosa-libnpu-warboy furiosa-libnux

pip uninstall furiosa-sdk-quantizer furiosa-sdk-runtime furiosa-sdk-validator && \
pip install --upgrade furiosa-sdk

주요 변경 사항

커널 드라이버 (furiosa-driver-pdma)가 1.2.2로 유저레벨 드라이버 (furiosa-libnpu-warboy)는 0.5.2로 업그레이드 되어 더 안정적이고 높은 NPU의 성능을 제공한다. 그 외에 주요 변경사항은 다음과 같다.

컴파일러

  • NPU 가속 연산자 추가 (가속 연산자의 전체 리스트는 가속 지원 연산자 목록 를 참고)

    • Space-to-depth (CRD 모드)

    • Transpose

    • Slice (height 축 한정)

    • Concat (height 축 한정)

    • Grouped Convolution (groups <= 128 인 경우)

  • 큰 메모리 사용량을 요구하는 연산자가 포함된 모델에서 CPU 테스크 빈도를 크게 줄이는 개선 (실행 시간 감소)

Quantizer

  • 모델 양자화 과정이 멱등성 (idempotent) 을 보장하도록 개선

  • PyTorch 의존성 제거

  • 다수의 Pylint 경고를 제거하여 코드 품질 향상

  • 다수의 라이브러리 의존성 업그레이드 (Numpy -> 1.21.5, Pyyaml -> 6.0.0 등)

Python SDK

  • Python SDK 프로젝트 구조 변경

    • furiosa-sdk-runtime -> furiosa-sdk

    • furiosa-sdk-quantizer -> furiosa-quantizer

    • furiosa-sdk-validator -> furiosa-litmus

  • 모델이 Furiosa SDK와 호환되는지 검사하는 패키지인 validator가 litmus로 이름이 변경되어 설치 방법이 아래와 같이 변경되었다. 더 자세한 사용 방법은 furiosa litmus (모델 호환성 검사 도구) 를 참조

    $ pip install 'furiosa-sdk[litmus]'
    

Furiosa Serving: FastAPI 기반의 고급 서빙 라이브러리 추가

furiosa-serving은 FastAPI 기반으로 모델 추론 API의 실행 전후에 Python 기반의 비지니스 로직이나 이미지 전후 처리 코드 등을 쉽게 추가할 수 있게 한다.

설치는 아래와 같이 할 수 있다.

$ pip install 'furiosa-sdk[serving]'

사용 예제는 아래와 같으며 더 자세한 사용법은 furiosa-serving Github 에서 살펴볼 수 있다.

from typing import Dict

from fastapi import File, UploadFile
from furiosa.server.utils.thread import synchronous
from furiosa.serving import ServeAPI, ServeModel
import numpy as np


serve = ServeAPI()


model: ServeModel = synchronous(serve.model)(
    'imagenet',
    location='./examples/assets/models/image_classification.onnx'
)

@model.post("/models/imagenet/infer")
async def infer(image: UploadFile = File(...)) -> Dict:
    # Convert image to Numpy array with your preprocess() function
    tensors: List[np.ndarray] = preprocess(image)

    # Infer from ServeModel
    result: List[np.ndarray] = await model.predict(tensors)

    # Classify model from numpy array with your postprocess() function
    response: Dict = postprocess(result)

    return response