2023년 9월 10일 일요일

NEMO2023 (카카오 모빌리티 테크 컨퍼런스) 후기

공식 사이트: https://nemo.kakaomobility.com/


카카오 모빌리티에서 주최하는 NEMO(NEXT MOBILITY) 2023 컨퍼런스가 개최되어서 참관하고 왔습니다. 

컨퍼런스는 아래의 스케쥴로 구성되어 있었습니다.


공통으로 듣는 세션과 세 가지중 한가지를 선택하여 듣는 일정이였습니다. 저는 사전등록으로 FUTURE 세션을 듣는것을 골랐습니다.




다과와 커피도 준비되어 있어 컨퍼런스를 본격적으로 보기 전에 배를 채울 수 있었습니다.


기조연설

기조연설은 카카오 모빌리티, 구글, 카카오 브레인에서 발표를 하였고 앞으로의 미래와 각 회사에서 구현중인 기술적인 내용 위주로 진행하였습니다.

카카오 브레인에서는 생성형 AI의 미래와 현재 연구 개발중인 AI 데모도 보여주었습니다.
카카오 모빌리티는 아무래도 플랫폼 기업이다보니 플랫폼 관점에서의 미래 위주로 발표를 진행했었고
구글은 간단하게 AI를 deploy할 수 있는 Big query, Duet AI를 소개하였습니다.
(사실 기조연설보다는 얼른 FUTURE 세션을 듣고 싶었습니다..)



FUTURE 세션





기조연설이 끝나고 간단한 다과가 셋팅되어 배를 또 채울 수 있었습니다.
첫 세션은 현재 카카오 모빌리티가 개발하고 있는 자율주행에 관한 내용이였습니다.
자율주행의 기술로 크게 인식, 측위, 주행, 시스템 최적화를 언급하였고 다음 세션에서 발표할 데이터 엔진도 언급하였습니다.
일반적으로 사용되 자율주행의 기술들인 segmentation, lidar를 이용한 point cloud 등의 기술들을 소개하였습니다.





사실 시간이 짧다보니 자세한 기술들에 대해서는 듣지 못했던점이 아쉽습니다.
대체로 "이런 이런 기술들을 사용했다" 하고 넘어가는 느낌이였습니다.

두 번째 세션에서는 데이터 엔진에대해 좀 더 자세히 설명하는 세션이였습니다.
모빌리티 플랫폼을 구축하여 데이터를 쌓고 이 데이터 기반으로 모델을 강화시키는 엔진을 의미하는듯 하였습니다.
그리고 텔레오퍼레이션 기술도 반영하여 자율주행하는 자동차가 멈추면 원격으로 문제를 해결해주는 기능도 소개하여 흥미롭게 들었습니다.


세번째 세션에서는 자율주행의 3D Object detection task에서 Domain shift 문제를 어떻게 해결하는지 교수님을 초빙하여 진행하였습니다.

자율주행에서 발생하는 여러 Domain shift현상들을 (날씨, 센서 상황, 데이터 수집 차량 환경, 나라의 차이 등) 해결하기위해 semi-supervised learning 방식으로 접근하였다고 합니다.

두 가지 단계로 구성되어있는데 1. Source domain과 Target domain의 차이를 줄이는 단계, 2. 레이블링 되지않은 데이터와 되어있는 데이터의 차이를 줄이는 단계로 구성되었다고 합니다.

위의 단계를 수행할 수 있는 모델 아키텍쳐로 구성하였고 Mixup augmentation으로 데이터를 증강시켰으며 Lidar data의 polar coordinate를 Target domain의 polar coordinate로 맞춰 학습이 이루어졌다고 합니다.

해당 방식으로 Waymo 데이터를 이용해 nuScenes 환경에서 SOTA를 달성할 수 있었다고 합니다.

https://youtu.be/WO-jG4UJrlg?t=1694 에서 영상이 공개되어 있으니 참고하면 좋을것 같습니다.

15분이라는 짧은 시간동안 많은 좋은 내용들을 전달해주셨습니다.


나머지 세션들도 플랫폼, 로봇, UAM 사업들을 소개하며 유익한 내용들을 전해주셨습니다.
앞으로도 이러한 컨퍼런스가 있으면 참여해서 다른 회사에서 집중하는 산업과 기술들의 트렌드를 따라가면 좋을것 같네요.

2022년 2월 27일 일요일

if constexpr 구문

 if constexpr 구문은 템플릿 함수가 컴파일 시에 동일한 함수 내에서 여러 범위를 평가할 수 있게 합니다.

1
2
3
4
5
6
7
8
struct Bear
{
    auto roar() const { std::cout << "Roar!\n"; }
};
struct Duck
{
    auto quack() const { std::cout << "Quack!\n"; }
};
cs

위와 같은 Bear와 Duck 클래스가 있을 때 의성어를 내는 메소드를 만든다고 가정해봅시다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct Animal 
{
    virtual ~Animal() {}
    virtual void speak() const {}
};
struct Bear : public Animal
{
    void roar() const { std::cout << "Roar!\n"; }
    void speak() const override { roar(); }
};
struct Duck: public Animal
{
    void quack() const { std::cout << "Quack!\n"; }
    void speak() const override  { quack(); }
};
cs

OOP관점에서 생각하자면 위와 같이 Animal이라는 클래스를 만들어 Bear와 Duck를 상속시켜주고 speak()과 같은 메소드에서 roar(), quack() 메소드를 각각 호출해주는 방법을 생각해볼 수 있습니다.


if constexpr 구문을 사용하면 상속을 사용하지 않고 컴파일 타임에 두 객체의 종류에 맞게 메소드를 호출할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct Bear
{
    void roar() const { std::cout << "Roar!\n"; }
};
struct Duck
{
    void quack() const { std::cout << "Quack!\n"; }
};
 
template <typename Animal>
void speak(const Animal &a)
{
    if constexpr (std::is_same_v<Animal, Bear>)
    {
        a.roar();
    }
    else if constexpr (std::is_same_v<Animal, Duck>)
    {
        a.quack();
    }
}
cs

compile time에 연산이 수행되는 if constexpr 구문을 사용하는게 훨씬 효율적이라고 합니다.

Reference: 고성능을 위한 언어 C++

2022년 2월 18일 금요일

② Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference




이어서 QAT에 대해 더 알아보도록 하겠습니다.
먼저 QAT를 Batch normalizationSkip connection에 어떻게 적용하는지 보도록 하겠습니다.



[Quantization aware training: Batch normalization folding] 

Conv2d+Batch normalization+Activation 형태의 block을 사용하는 모델들이 대중화되었습니다. 이렇게 Batch normalization을 적용할 때 더 빠른 inference를 위해 weights들을 결합(fusing)하는 최적화를 하게 됩니다.
(해당 내용들은 https://lyzqm.blogspot.com/2021/12/foldingfusing-batch-normalization.html 에 정리해놨으니 참고바랍니다.)

QAT를 적용할 때는 fusing된 weights들에 fake quantization을 적용하고 마찬가지로 activation output에대해서도 적용합니다.




[Quantization aware training: Skip connection] 

   

Resnet에서 사용하는 Skip connection도 QAT를 적용할 때도 기존 방식과 유사합니다.
convolution을 거친 output에 fake quantization을 적용하는것 이외에는 다른것이 없습니다.




[Quantization aware training: Experiments]

Mobilenet의 결과입니다. 
QAT를 적용하여 quantization된 8bit 모델이 퀄컴사의 스냅드래곤에서 
모두 같은 성능대비 빠른 inference가 가능한것을 확인할 수 있습니다.




이러한 성능은 Object detection에서도 비슷하게 나타납니다. 
위의 실험은 MobilenetSSD로 COCO data를 학습시키고 벤치마킹한 결과입니다.
mAP지표는 큰 차이는 없지만 속도 측면에서 향상된 모습을 볼 수 있습니다.



[Conclusion] 
지금까지 QAT에 대해 알아봤습니다. 
quantization효과를 학습하는 과정에서 미리 그 효과를 반영하여 학습 후에 quantization을 진행하여도 성능하락이 없도록 만드는 깔끔하고 간단한 방법인것 같습니다.
NVIDIA, Qualcomm, Google과 같은 기업에서 제공해주는 딥러닝 학습 프레임워크에 모두 QAT를 사용할 수 있는 API가 있을 정도로 많이 사용되는 방법이니 직접 코드를 찾아보셔도 좋을것 같습니다.