Path: blob/master/site/ko/tutorials/optimization/compression.ipynb
25118 views
Copyright 2022 The TensorFlow Compression Authors.
확장 가능한 모델 압축
개요
이 노트북은 TensorFlow Compression을 사용하여 모델을 압축하는 방법을 보여줍니다.
아래 예에서는 분류 정확도를 유지하면서 MNIST 분류자의 가중치를 부동 소수점 표현보다 훨씬 작은 크기로 압축합니다. 이 작업은 Scalable Model Compression by Entropy Penalized Reparameterization 논문에 기초한 두 단계 프로세스로 수행됩니다.
훈련 중에 명시적 엔트로피 페널티로 "압축 가능" 모델을 훈련하여 모델 매개변수의 압축성을 유도합니다. 이 페널티에 대한 가중치 를 통해 압축된 모델 크기와 정확도 간의 균형을 지속적으로 제어할 수 있습니다.
페널티와 일치하는 코딩 방식을 사용하여 압축 가능한 모델을 압축된 모델로 인코딩합니다. 즉, 페널티가 모델 크기에 대한 좋은 예측 변수입니다. 이렇게 하면 메서드가 미세 조정을 위해 모델 훈련, 압축 및 재훈련을 여러 번 반복할 필요가 없습니다.
이 방법은 계산 복잡성이 아니라 압축된 모델 크기에만 엄격히 관련됩니다. 크기와 복잡성을 줄이기 위해 모델 정리(model pruning)와 같은 기술과 결합할 수 있습니다.
다양한 모델에서 압축 결과의 예:
모델(데이터세트) | 모델 크기 | 압축 비율 | 상위 1 오차 보정(비압축) |
---|---|---|---|
LeNet300-100 (MNIST) | 8.56 KB | 124x | 1.9% (1.6%) |
LeNet5-Caffe (MNIST) | 2.84 KB | 606x | 1.0% (0.7%) |
VGG-16 (CIFAR-10) | 101 KB | 590x | 10.0% (6.6%) |
ResNet-20-4 (CIFAR-10) | 128 KB | 134x | 8.8% (5.0%) |
ResNet-18 (ImageNet) | 1.97 MB | 24x | 30.0% (30.0%) |
ResNet-50 (ImageNet) | 5.49 MB | 19x | 26.0% (25.0%) |
애플리케이션은 다음을 포함합니다.
모델을 대규모로 에지 장치에 배포/브로드캐스팅하여 전송 대역폭을 절약합니다.
페더레이션 학습에서 클라이언트에게 글로벌 모델 상태를 전달합니다. 모델 아키텍처(숨겨진 유닛의 수 등)는 초기 모델에서 변경되지 않았으며 클라이언트는 압축 해제된 모델에 대해 학습을 계속할 수 있습니다.
메모리가 크게 제한된 클라이언트에서 추론을 수행합니다. 추론하는 동안 각 레이어의 가중치는 순차적으로 압축 해제되고 활성화가 계산된 직후 버릴 수 있습니다.
설정
pip
를 통해 Tensorflow Compression을 설치합니다.
라이브러리 종속성을 가져옵니다.
기본 MNIST 분류자 정의 및 훈련하기
밀집 및 컨볼루션 레이어를 효과적으로 압축하려면 사용자 정의 레이어 클래스를 정의해야 합니다. 이는 tf.keras.layers
아래의 레이어와 유사하지만 나중에 EPR(엔트로피 페널티 재매개변수화)을 효과적으로 구현하기 위해 하위 클래스화할 것입니다. 이를 위해 복사 생성자도 추가합니다.
먼저 표준 밀집 레이어를 정의합니다.
마찬가지로 2D 컨볼루션 레이어를 정의합니다.
모델 압축을 계속하기 전에 일반 분류자를 성공적으로 훈련할 수 있는지 확인하겠습니다.
모델 아키텍처를 정의합니다.
훈련 데이터를 로드합니다.
마지막으로 모델을 훈련합니다.
성공입니다! 모델이 잘 훈련되었고 5번의 epoch 내에서 검증 세트에 대해 98% 이상의 정확도에 도달했습니다.
압축 가능한 분류자 훈련하기
EPR(Entropy Penalized Reparameterization)에는 두 가지 주요 구성 요소가 있습니다.
가중치의 인코딩 방식과 일치하는 확률 모델에서 엔트로피에 해당하는 모델 가중치에 페널티를 훈련 중에 적용합니다. 아래에서 이 페널티를 구현하는 Keras
Regularizer
를 정의합니다.가중치를 다시 매개변수화합니다. 즉, 더 압축 가능한 잠재 표현으로 가져옵니다(압축성과 모델 성능 사이에 더 나은 균형을 제공함). 컨볼루션 커널의 경우 퓨리에 도메인이 좋은 표현인 것으로 나타났습니다. 다른 매개변수의 경우 아래 예는 단순히 다양한 양자화 단계 크기로 스칼라 양자화(반올림)를 사용합니다.
먼저 페널티를 정의합니다.
아래 예제는 tfc.PowerLawEntropyModel
클래스에서 구현된 코드/확률 모델을 사용합니다. 이 모델은 Optimizing Communication-Accuracy Trade-off in Federated Learning with Rate-Distortion Theory 논문에서 아이디어를 얻었습니다. 페널티는 로 정의되며 여기서 는 모델 매개변수 또는 잠재 표현의 한 요소이고 는 0 값 주변의 수치적 안정성을 위한 작은 상수입니다.
페널티는 사실상 정규화 손실입니다(때로 "가중치 손실"이라고도 함). 이것이 0에 첨두를 둔 오목한 형태라는 사실은 가중치 희소성을 높입니다. 가중치 압축에 적용된 코딩 체계인 Elias 감마 코드는 요소의 크기에 대해 비트 길이의 코드를 생성합니다. 즉, 페널티와 매칭되고 페널티를 적용함으로써 예상되는 코드 길이를 최소화합니다.
둘째, 다음과 같은 추가적인 기능이 있는 CustomDense
및 CustomConv2D
의 하위 클래스를 정의합니다.
위에 나온 regularizer의 인스턴스를 가져와서 훈련하는 동안 커널과 바이어스에 적용합니다.
커널과 바이어스를
@property
로 정의하여 변수에 액세스할 때마다 직선 기울기로 양자화를 수행합니다. 이는 나중에 압축된 모델에서 수행되는 계산을 정확하게 반영합니다.양자화 단계 크기의 로그를 나타내는 추가
log_step
변수를 정의합니다. 양자화가 거칠수록 모델 크기는 작아지지만 정확도는 낮아집니다. 양자화 단계 크기는 각 모델 매개변수에 대해 학습할 수 있으므로 페널티가 적용된 손실 함수에 대한 최적화를 수행하면 어떤 양자화 단계 크기가 가장 좋은지 결정됩니다.
양자화 단계는 다음과 같이 정의됩니다.
이를 통해 다음과 같이 밀집 레이어를 정의할 수 있습니다.
컨볼루션 레이어도 유사합니다. 또한 컨볼루션 커널은 커널이 설정될 때마다 RDFT(실수 이산 퓨리에 변환)로 저장되고 커널이 사용될 때마다 변환이 반전됩니다. 커널의 서로 다른 주파수 성분은 다소 압축 가능한 경향이 있기 때문에 각각 고유한 양자화 단계 크기가 할당됩니다.
퓨리에 변환과 그 역을 다음과 같이 정의합니다.
이를 통해 컨볼루션 레이어를 다음과 같이 정의합니다.
위와 동일한 아키텍처로 분류자 모델을 정의하지만 다음과 같이 수정된 레이어를 사용합니다.
그리고 모델을 훈련합니다.
압축 가능한 모델이 일반 분류자와 유사한 정확도에 도달했습니다.
그러나 이 모델은 아직 실제로 압축되지 않았습니다. 이를 위해 우리는 커널과 바이어스를 압축된 형태로 저장하는 또 다른 하위 클래스 세트를 비트 시퀀스로 정의합니다.
분류자 압축하기
아래에 정의된 CustomDense
및 CustomConv2D
의 하위 클래스는 압축 가능한 밀집 레이어의 가중치를 바이너리 문자열로 변환합니다. 또한 양자화 단계 크기의 로그를 절반 정밀도로 저장하여 공간을 절약합니다. @property
를 통해 커널 또는 바이어스에 액세스할 때마다 문자열 표현에서 압축이 해제되고 양자화됩니다.
먼저, 모델 매개변수를 압축 및 압축 해제하는 함수를 정의합니다.
이를 통해 CompressedDense
를 정의할 수 있습니다.
컨볼루션 레이어 클래스는 위와 유사합니다.
압축 가능한 모델을 압축된 모델로 바꾸려면 clone_model
함수를 편리하게 사용할 수 있습니다. compress_layer
는 압축 가능한 레이어를 압축된 레이어로 변환하고 다른 유형의 레이어(예: Flatten
)를 간단히 통과합니다.
이제 압축된 모델이 여전히 예상대로 작동하는지 검증해 보겠습니다.
압축된 모델의 분류 정확도는 훈련 중에 얻은 것과 동일합니다!
또한 압축된 모델 가중치의 크기는 원래 모델 크기보다 훨씬 작습니다.
모델을 디스크에 저장하려면 모델 아키텍처, 함수 그래프 등을 저장하는 데 약간의 오버헤드가 필요합니다.
ZIP과 같은 무손실 압축 방식이 이러한 유형의 데이터를 압축하는 데 적합하지만 가중치 자체는 그렇지 않습니다. 이 때문에 ZIP 압축을 적용한 후에도 오버헤드를 포함하여 모델 크기를 계산해보면 여전히 EPR에 상당한 이점이 있습니다.
정규화 효과와 크기-정확도 절충
위에서 하이퍼파라미터는 2로 설정되었습니다(모델의 매개변수 수로 정규화됨). 가 증가함에 따라 모델 가중치는 압축성에 대해 점점 더 많은 패널티를 받습니다.
값이 낮으면 페널티가 가중치 regularizer처럼 작동할 수 있습니다. 이것은 실제로 분류자의 일반화 성능에 유익한 영향을 미치며 유효성 검사 데이터세트에서 약간 더 높은 정확도로 이어질 수 있습니다.
값이 높을수록 모델 크기가 점점 작아지지만 정확도도 점차 감소합니다. 이를 확인하기 위해 몇 가지 모델을 훈련하고 크기 대 정확도 플롯을 나타내 보겠습니다.
이 플롯은 이상적으로 팔꿈치 모양의 크기-정확도 절충을 보여야 하지만 정확도 메트릭에 다소 노이즈가 있는 것은 정상입니다. 초기화에 따라 곡선이 약간 꼬일 수 있습니다.
정규화 효과로 인해 EPR 압축 모델은 의 작은 값에 대해 원래 모델보다 테스트 세트에서 더 정확합니다. 추가 ZIP 압축 후 크기를 비교하더라도 EPR 압축 모델이 몇 배 더 작습니다.
분류자 압축 해제하기
CompressedDense
및 CompressedConv2D
는 모든 정방향 패스에서 가중치의 압축을 해제합니다. 따라서 메모리가 제한된 장치에 이상적이지만 압축 해제는 특히 작은 배치 크기의 경우 계산 비용이 많이 들 수 있습니다.
모델을 한 번 압축 해제하고 추가 훈련이나 추론에 사용하려면 일반 또는 압축 가능한 레이어를 사용하여 모델로 다시 변환할 수 있습니다. 이는 모델 배포 또는 페더레이션 학습 시나리오에서 유용할 수 있습니다.
먼저, 일반 모델로 다시 변환하여 추론을 수행하거나 압축 페널티 없이 일반 훈련을 계속할 수 있습니다.
훈련이 정규화 없이 수행되기 때문에 추가 epoch에 대한 훈련 후에 유효성 검사 정확도가 떨어집니다.
또는 압축 페널티로 추론 및/또는 추가 훈련하기 위해 모델을 "압축 가능한" 모델로 다시 변환할 수 있습니다.
여기서 추가 epoch에 대한 훈련 후 정확도가 향상됩니다.