ddps-lab / lambda-optimize-serving

lambda converter and lambda serving
Apache License 2.0
3 stars 4 forks source link

[AYCI] Arm Tvm converter, inference lambda 코드 이상, tvm 환경 이상 체크 #29

Open workdd opened 2 years ago

workdd commented 2 years ago

현재 step function 시스템 내에서 성능 측정을 해보는 중입니다. 그 결과 예전에 arm tvm에서 추론 성능을 측정해보았을 때보다 성능이 정상적이지 않은 수준으로 안좋게 나오는 상황입니다.

inception_v3 | torch | onnx | tvm | torch | onnx | tvm -- | -- | -- | -- | -- | -- | -- convert time |   | 8.56 | 89.5 |   | 9.21 | 565.59 inference lambda time | 11.43 | 2.46 | 13.53 | 4.61 | 4.57 | 66.65 inception_v3를 대표적으로 보았을 때, 565초의 convert time과 1분 이상의 추론 시간이 소요되는 것은 세팅에 문제가 있다고 판단이 됩니다. 따라서 이를 한번 체크해보아야 할 듯 합니다.
subeans commented 2 years ago

ARM TVM의 inference time 측정 결과가 오래걸리는 부분에서 이상하다고 판단되어 time 측정하는 부분을 세분화하여 실험을 다시 진행하였습니다. 순수 추론만하는 inference time 과 lambda handler time 으로 변경하여 구글 시트의 inf/hander time 탭에 기록하였습니다. ( torch - image classification 진행 ) https://docs.google.com/spreadsheets/d/1-j5EuReBIeh_DvSjYeCRO4kWl9cFSZQjEJAlT9jp_4U/edit?usp=sharing

우선 현재 실험 환경은 람다 2048 메모리 사이즈이며, 기록된 모델은 모델의 크기 순서대로 정렬해둔 상태입니다.

실험 값을 확인하던 중 모델 사이즈가 커질 수록 tvm 성능이 급격하게 안좋아지는 것을 보았으며 결론적으로 메모리 사이즈가 적어 효과적인 최적화가 진행되고 있지 않다고 판단되었습니다. 따라서 추가적으로 람다 메모리를 증가하여 진행해보려고 합니다. ( 해당 실험은 람다 메모리 설정만 바꾸어 진행하면되기에 오버헤드가 크지 않으므로 빠른 시간 내로 가능할 듯 합니다. )

kmu-leeky commented 2 years ago

그러네 수빈아. inference time 만 해도 엄청 오래 걸리기는 하네. 메모리를 늘려서 시도해보는것 좋은 시도이다. 실험 결과로 추가하기에도 좋을것 같아. 진행해보고 결과 공유해보자.

workdd commented 2 years ago

현재 해당 시트에 10240에 대한 결과도 기입이 완료됐습니다. 여전히 arm tvm이 성능이 안좋은 상황입니다. 근데 예전에 람다에서 진행한 arm tvm 성능과 비교해 보니 차이가 커서 세팅에 대한 문제가 있는 것으로 판단이 됩니다. 시트에 예전에 기록해두었던 성능버전도 파란색으로 표시해두었습니다.

workdd commented 2 years ago

현재 arm tvm을 빌드했을 때 기존에 arm에서 사용했던 코드인 target = tvm.arm_cpu() 코드가 에러가 발생했어서, 임의로 target = "llvm -device=arm_cpu -mtriple=aarch64-linux-gnu" 해당 방식으로 진행을 하고 있는 상황입니다. 이렇게 target이 바뀜에 따라서 성능 차이가 큰 듯 보입니다

kmu-leeky commented 2 years ago

오케이. 그럴 여지가 있겠다. 원래 진행했던 타켓으로 실행이 될 수 있다면 좋을텐데 해당 내용 포함해서 해결을 시도해보자.

subeans commented 2 years ago

원래 진행했던 타겟으로 실행할 수 있어 진행한 결과 실험 결과에 큰 차이는 없는 것으로 확인하였습니다.

현재 성능이 좋지 않다고 판단하는 이유는 이전 실험결과와 비교하였기 때문입니다. 따라서 이전 실험 과정과 현재 실험 과정의 차이점을 생각해보았습니다. 이전 실험의 경우 인스턴스에서의 tvm compile + 람다에서의 추론 과정으로 진행하였지만 현재 실험은 람다에서의 tvm compile + 람다에서의 추론 과정으로 tvm compile 이 진행되는 위치가 다르게 됩니다.

때문에 현재 구성된 step function 과정에서 추론시 인스턴스에서 컴파일한 모델을 사용하도록 변경해보았을 때 이전과 같은 실험결과를 볼 수 있었고 결과적으로 람다에서 compile 하는 과정에 문제가 있음을 확인했습니다. ( serving 람다에는 문제가 없음을 확인 ) compile 하는 과정에 사용된 코드는 인스턴스에서 진행할 때와 같은 코드를 사용했기에 코드상의 문제로 생각되기 보다는 람다 환경문제( 충분한 메모리 필요 )쪽으로 확인해보고 있습니다.

kmu-leeky commented 2 years ago

아 잘 발견했네. 람다에서 tvm 빌드가 문제라는 이야기인거지? 당연하겠지만 ec2 에서 빌드한 이미지와 람다에서 빌드해서 만들어진 최적화 이미지의 크기는 어떻게 되는지 확인해줄래? 얼마나 많이 다른지 궁금해서. 최적화된 모델이 다른 내용을 조금 더 분석해보고 논문에서 어떻게 대응할런지 결정해보자.

subeans commented 2 years ago

제가 위에서 언급한 tvm compile 은 tvm 자체를 빌드하는 것이 아닌 tvm 을 사용한 model compile 을 의미하였습니다. tvm 자체 빌드는 ec2 에서 이미지 생성시 이루어지며 tvm 빌드가 되어있는 이미지를 람다에서 실행하게 됩니다. 따라서 최적화 이미지는 한 개이며 model compile 을 하는 과정에서 차이가 있을 수 있음을 의미합니다.

람다에서 model compile 시 다른 설정이 필요한지 파악해보겠습니다.

kmu-leeky commented 2 years ago

응 수빈아. 나도 그렇게 이해했어. TVM 환경은 EC2 에서 빌드 되었을텐데, TVM 으로 빌드한 최적화된 모델은 EC2 에서 한것과 람다에서 한것이 서로 다른거지? 그 결과물의 차이가 클런지 궁금했었어.

subeans commented 2 years ago

네 교수님, ec2 에서 최적화한 모델의 크기와 람다에서 최적화를 진행한 모델의 크기를 비교해보았습니다. torch 프레임워크, batchsize 1, resnet50 ( 97.8MB )을 기준으로 이전 실험에 이용된 ec2에서 최적화한 모델의 크기는 178MB 이었지만 이번 실험에서 이용된 람다에서 최적화한 모델의 크기는 90.7MB 였습니다. 결과물의 차이가 크다고 보이며, 람다내에서 tvm model compile 시 설정에 확인을 추가적으로 해볼 필요가 있어 보입니다.

또한 이전에 말한 target 설정에 차이가 없다고 한 부분은 lambda-serving 에 문제가 있다고 판단되어 해당 부분만 확인하였으나 현재로서 가장 먼저 시도해볼만한 부분은 tvm model compile 시 target 을 변경하는 과정입니다.

kmu-leeky commented 2 years ago

오케이. 확인 땡큐. 람다에서는 제대로 컴파일이 안되것 같기는 하다. 우선 실험 결과는 EC2 에서 컴파일한 모델로 정리를 해야 할것 같네. 람다에서 컴파이할때 문제가 생기는건 따로 해결을 하기는 해야겠다. 잘 발견해냈다.

subeans commented 2 years ago

서버리스에서 ARM 하드웨어를 타겟으로 모델 최적화할때 제대로 컴파일이 안되는 문제가 있었습니다. 이후 서버리스 ARM 하드웨어의 타겟을 제대로 찾는 과정이 필요합니다. ( 인스턴스에서의 모델 최적화 추론결과와 서버리스에서의 모델 최적화 추론결과가 달랐음 )