INN(Integral Neural Networks)은 한 번 훈련된 후 미세 조정 없이 임의의 사용자 정의 크기로 변환될 수 있는 유연한 아키텍처입니다. 음파(음악)는 원하는 샘플링 속도(음질)로 샘플링될 수 있으므로 INN은 데이터 및 매개변수 모양(DNN 품질)을 동적으로 변경할 수 있습니다.
TheStage.ai 팀은 IEEE/CVF CVPR 2023 컨퍼런스에서 "Integral Neural Networks"라는 논문을 발표했습니다. 이 작품은 이번 행사에 소개된 단 12개의 '수상 후보' 논문 중 하나로 인정받았습니다. INN은 연속 매개변수와 적분 연산자를 결합하여 기본 레이어를 나타내는 새로운 종류의 신경망입니다. 추론 단계에서 INN은 연속 가중치의 개별 샘플링을 통해 일반 DNN 표현으로 변환됩니다. 이러한 네트워크의 매개변수는 필터 및 채널 차원을 따라 연속적이므로 해당 차원을 따라 재분산하는 것만으로도 미세 조정 없이 구조화된 가지치기가 가능합니다.
이 기사에서는 4x 이미지 초해상도 EDSR 모델을 INN으로 변환하는 과정을 안내한 다음 모델의 구조화된 가지치기를 달성하는 방법을 보여줍니다. 마지막으로, 효율적인 추론을 위해 INN을 개별 DNN으로 다시 변환하고 Nvidia GPU에 배포합니다. 이번 글은 다음과 같이 진행됩니다.
추가 정보 및 업데이트는 다음 리소스를 확인하세요.
INN의 레이어는 적분 연산자로 대체되지만 적분 연산자를 실제로 평가하려면 수치 적분 방법을 사용하기 위해 입력 신호를 이산화해야 합니다. INN의 레이어는 이산화 후 기존 DNN 레이어(완전 연결, 컨볼루션)와 일치하는 방식으로 설계되었습니다.
이미지 초해상도는 알려져 있거나 알려지지 않은 저하 연산자를 사용하여 이미지를 향상시켜야 하는 잘 알려진 컴퓨터 비전 작업입니다. 우리는 쌍입방 다운샘플링을 저하 연산자로 사용하는 고전적인 초해상도 형식을 고려합니다.
확산 모델 및 변환기를 기반으로 하는 고급 신경망을 포함하여 이미지 초해상도 작업에 많은 아키텍처를 사용할 수 있습니다. 이 문서에서는 4x EDSR 아키텍처에 중점을 둘 것입니다. EDSR 아키텍처는 ResNet(많은 딥 러닝 문제에 널리 사용됨)과 마지막에 4x 업샘플링 블록으로 구성되어 있으므로 데모에 매우 적합합니다. EDSR에 대한 개략적인 설명은 다음 그림에서 확인할 수 있습니다.
전체 필터 또는 채널을 삭제하는 구조화된 가지치기는 EDSR의 기본 구성 요소 역할을 하는 잔여 블록에 대해 고유한 의미를 갖습니다. 각 상태는 입력에 Conv -> ReLU -> Conv 블록을 추가하여 업데이트되므로 입력 및 출력 신호에는 동일한 수의 매개변수가 있어야 합니다. 이는 가지치기 종속성 그래프를 생성하여 TorchIntegral에서 효율적으로 관리할 수 있습니다. 아래 그림은 각 잔차 블록의 두 번째 컨볼루션이 단일 그룹을 형성하는 것을 보여줍니다.
잔차 블록의 두 번째 컨볼루션을 제거하려면 각 잔차 블록의 두 번째 컨볼루션을 모두 제거해야 합니다. 그러나 보다 유연한 설정을 위해 모든 잔차 블록에서 첫 번째 컨볼루션의 필터와 두 번째 컨볼루션의 채널을 제거합니다.
사전 훈련된 DNN의 변환을 위해 우리는 더욱 부드러운 보간을 통해 특수 필터 채널 순열 알고리즘을 활용합니다. 순열 알고리즘은 모델 품질을 유지하면서 DNN의 가중치를 연속 함수에서 샘플링한 것처럼 보이게 만듭니다.
import torch import torchintegral as inn from super_image import EdsrModel # creating 4x EDSR model model = EdsrModel.from_pretrained("eugenesiow/edsr", scale=4).cuda() # Transform model layers to integral. # continous_dims and discrete dims define which dimensions # of parameters tensors should be parametrized continuously # or stay fixed size as in discrete networks. # In our case we make all filter and channel dimensions # to be continuous excluding convolutions of the upsample block. model = inn.IntegralWrapper(init_from_discrete=True)( model, example_input, continuous_dims, discrete_dims ).cuda()
통합 그리드 튜닝은 사용자 정의 숫자에 대해 필터를 샘플링해야 하는 매개변수 텐서를 원활하게(SGD 최적화에서) 선택하는 작업입니다. 필터/채널 삭제 방법과 달리 INN은 보간 작업으로 인해 여러 개의 개별 필터를 결합할 수 있는 필터를 생성합니다.
INN은 필터 및 채널 차원에 따라 매개변수의 텐서에 대해 인덱스별 소프트 선택 작업을 도입합니다.
# Set trainable gird for each integral layer # Each group should have the same grid # During the sum of continuous signals # We need to sample it using the same set of points for group in model.groups: new_size = 224 if 'operator' in group.operations else 128 group.reset_grid(inn.TrainableGrid1D(new_size)) # Prepare model for tuning of integration grid model.grid_tuning() # Start training train(model, train_data, test_data)
통합 그리드 튜닝은 작은 교정 세트에서 수행할 수 있는 빠른 최적화 프로세스 입니다. 이 최적화의 결과는 구조적으로 압축된 DNN입니다. 단일 Nvidia A4000에 대한 테스트에서는 전체 Div2k 데이터세트에 대한 통합 그리드 튜닝에 4분이 소요되는 것으로 나타났습니다. 4x A4000의 분산 설정은 거의 4배의 속도 향상을 보여주며, 결과적으로 최적화 시간은 단 1분 입니다.
실험 중에 우리는 500개의 이미지가 4000개의 이미지로 구성된 전체 훈련 세트 Div2k와 동일한 결과를 제공한다는 것을 발견했습니다.
결과 INN 모델은 개별 모델로 쉽게 변환되어 모든 NVIDIA GPU에 배포될 수 있습니다. 우리는 64x64의 입력 해상도로 RTX A4000에서 초당 프레임 수(FPS)를 제공합니다. 압축된 모델은 거의 2배의 속도 향상을 달성합니다. 정리된 INN 모델을 이산 모델로 변환하려면 다음 코드 줄을 사용할 수 있습니다.
model = model.transform_to_discrete() # then model can be compiled, for instance # compilation can add an additional 1.4x speedup for inference model = torch.compile(model, backend='cudagraphs')
모델 | 사이즈 FP16 | FPS RTX A4000 | PSNR |
---|---|---|---|
EDSR 원본 | 75MB | 170 | 30.65 |
인 EDSR 30% | 52MB | 230 | 30.43 |
인 EDSR 40% | 45MB | 270 | 30.34 |
인 EDSR 50% | 37MB | 320 | 30.25 |
이 기사에서는 CVPR2023 수상 후보 논문 "Integral Neural Networks"에 대한 개요를 제시했습니다. 이는 4x EDSR 모델의 훈련 후 가지치기에 적용되어 단일 코드 줄과 통합 그리드의 1분 미세 조정으로 거의 2배의 속도 향상을 달성했습니다.
향후 기사에서는 INN의 더 많은 응용 프로그램을 소개하고 효율적인 모델 배포에 대한 자세한 내용을 다룰 것입니다. 계속 지켜봐 주시기 바랍니다:
관심을 가져주셔서 감사합니다!
여기에도 게시되었습니다.