새 커스텀 모델 또는 AutoML Vision Edge 모델을 학습시킨 후에는 다음을 사용할 수 있습니다. A/B Testing하여 새 모델이 실제 조건에서 얼마나 잘 작동하는지 확인합니다. 더 나아질 수 있습니다 새 모델이 테스팅에서 이전 모델보다 한 단계 개선된 것으로 확인되면 앱 업데이트 없이도 모든 사용자에게 손쉽게 새 모델을 적용할 수 있습니다.
이 페이지에서는 식물 이미지 검색 기능을 가상으로 구동하는 두 가지 버전의 모델을 A/B 테스트로 평가합니다. 사용자는 이 기능을 통해 커스텀 이미지 라벨 지정 모델을 사용하여 이미지에서 식물종을 파악할 수 있습니다.
방금 게시한 새로운 식물 라벨 지정 모델인 plant_labeler_v2
와 현재 모델인 plant_labeler_v1
을 비교하는 실험을 진행한다고 가정하겠습니다. 아래 단계에서는 실험을 설정하고 실행하여 그 결과를 바탕으로 조치를 취하는 방법을 보여줍니다.
1. 모델을 원격으로 구성 가능하도록 설정
모델 A/B 테스팅의 첫 번째 단계는 Remote Config 매개변수를 사용하여 모델에서 사용할 모델을 결정합니다. 처음에는 이 매개변수의 기본값을 앱에서 이미 사용 중인 모델로 설정하지만 원격 구성이 가능한 매개변수로 모델 이름을 제어하기 때문에 사용자에게 매번 앱 업데이트를 배포하지 않아도 여러 모델을 바꿔가며 실험할 수 있습니다.
따라서 plant_labeler_v1
이라는 이름으로 현재 모델을 게시했다면 다음 예시와 같이 앱 초기화 코드에서 plant_labeler_v1
을 plant_labeler_model
매개변수의 기본값으로 설정합니다.
Kotlin+KTX
val remoteConfig = FirebaseRemoteConfig.getInstance()
val remoteConfigDefaults = HashMap<String, Any>()
remoteConfigDefaults["plant_labeler_model"] = "plant_labeler_v1"
Tasks.await(remoteConfig.setDefaultsAsync(remoteConfigDefaults))
remoteConfig.fetchAndActivate().addOnSuccessListener { success ->
if (success) {
// Okay to get remote values.
// ...
}
}
Java
final FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.getInstance();
Map<String, Object> remoteConfigDefaults = new HashMap<>();
remoteConfigDefaults.put("plant_labeler_model", "plant_labeler_v1");
Tasks.await(remoteConfig.setDefaultsAsync(remoteConfigDefaults));
remoteConfig.fetchAndActivate().addOnSuccessListener(
new OnSuccessListener<Boolean>() {
@Override
public void onSuccess(Boolean success) {
if (success) {
// Okay to get remote values.
// ...
}
}
});
그런 다음 plant_labeler_model
매개변수에서 지정한 모델을 로드하도록 모델 설정 코드를 변경합니다.
Kotlin+KTX
val rcValue = remoteConfig.getValue("plant_labeler_model")
val remoteModelName = rcValue.asString()
// ...
val remoteModel = FirebaseRemoteModel.Builder(remoteModelName)
.enableModelUpdates(true)
.setInitialDownloadConditions(initialConditions)
.setUpdatesDownloadConditions(updateConditions)
.build()
FirebaseModelManager.getInstance().registerRemoteModel(remoteModel)
// Optionally configure a local model:
// https://firebase.google.com/docs/ml/android/label-images-with-automl#configure-a-local-model-source
// https://firebase.google.com/docs/ml/android/use-custom-models#configure_a_local_model
Java
FirebaseRemoteConfigValue rcValue = remoteConfig.getValue("plant_labeler_model");
String remoteModelName = rcValue.asString();
// ...
FirebaseRemoteModel remoteModel = new FirebaseRemoteModel.Builder(remoteModelName)
.enableModelUpdates(true)
.setInitialDownloadConditions(initialConditions)
.setUpdatesDownloadConditions(updateConditions)
.build();
FirebaseModelManager.getInstance().registerRemoteModel(remoteModel);
// Optionally configure a local model:
// https://firebase.google.com/docs/ml/android/label-images-with-automl#configure-a-local-model-source
// https://firebase.google.com/docs/ml/android/use-custom-models#configure_a_local_model
이제 앱에서 Remote Config 매개변수를 사용하여 새 모델을 게시하고 모델에 이름을 Remote Config 매개변수에 추가합니다. 이 기능을 사용하면 A/B Testing에서 모델을 비교하기 위해서입니다.
계속 진행하기 전에 모델 다운로드 코드에 다음 항목도 추가하세요.
Kotlin+KTX
FirebaseModelManager.getInstance().downloadRemoteModelIfNeeded(remoteModel)
.addOnSuccessListener {
// If the model downloaded was specified by a remote parameter, log an
// event, which will be our experiment's activation event.
if (rcValue.source == FirebaseRemoteConfig.VALUE_SOURCE_REMOTE) {
FirebaseAnalytics.getInstance(this).logEvent("nondefault_model_downloaded", null)
}
}
Java
FirebaseModelManager.getInstance().downloadRemoteModelIfNeeded(remoteModel)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
// If the model downloaded was specified by a remote parameter, log an
// event, which will be our experiment's activation event.
if (rcValue.getSource() == FirebaseRemoteConfig.VALUE_SOURCE_REMOTE) {
FirebaseAnalytics.getInstance(YourActivity.this)
.logEvent("nondefault_model_downloaded", null);
}
}
});
위의 코드는 나중에 실험의
2. 목표 측정항목 결정
다음 단계는 모델의 성공을 어떻게 측정할지 결정하고 이 측정항목에 따라 여러 모델 버전의 성능을 테스트하는 데 필요한 데이터를 앱에서 수집하도록 하는 것입니다.
A/B Testing에는 일일 수익 등 몇 가지 기본 제공 측정항목이 있습니다. 참여도, 사용자 유지율 등이 있습니다 이 측정항목은 주로 다양한 UX 흐름을 테스트하거나 매개변수를 미세 조정하는 데 유용하지만 모델 및 사용 사례를 평가할 때는 적합하지 않을 수도 있습니다. 이러한 경우에는 커스텀 애널리틱스 이벤트에 맞게 최적화해 보시기 바랍니다.
예로 든 가상의 식물 이미지 검색 기능에서는 각 결과의 모델 신뢰도 순으로 검색결과를 사용자에게 제공한다고 가정합니다. 모델의 정확성을 파악할 수 있는 방법 중 하나는 사용자가 첫 번째 검색결과를 여는 빈도를 살펴보는 것입니다.
어떤 모델이 상위 결과의 클릭수 극대화라는 목표를 달성하는 데 가장 효과적인지 테스트하려면 사용자가 결과 목록에서 첫 번째 항목을 탭할 때마다 커스텀 이벤트를 로깅하면 됩니다.
Kotlin+KTX
FirebaseAnalytics.getInstance(this).logEvent("first_result_opened", null)
Java
FirebaseAnalytics.getInstance(YourActivity.this).logEvent("first_result_opened", null);
궁극적으로 테스트할 측정항목은 앱에서 모델을 사용하는 방식에 따라 달라집니다.
이 시점에서 Play 스토어에 앱 배포가 가능합니다. 앱에서는 원래 모델을 계속 사용합니다. 추가한 Remote Config와 애널리틱스 코드를 사용하면 Firebase 콘솔만 사용하여 여러 모델을 가져올 수 있습니다
3. A/B Testing 실험 실행
이제 앱이 사용자의 분석 데이터를 수집하고 있습니다. 새 API를 사용할 때의 효과를 테스트하는 A/B Testing 실험을 만듭니다. 모델을 변경합니다.
실험 생성 방법은 다음과 같습니다.
-
이벤트에서 Firebase 콘솔의 페이지에서 애널리틱스 이벤트: 활성화 이벤트 및 목표 측정항목
앱이 각 이벤트를 적어도 한 번은 기록해야 Firebase 콘솔.
-
Firebase 콘솔에서 A/B Testing 섹션을 엽니다.
-
다음 안내에 따라 새 실험을 만듭니다.
실험 만들기 > Remote Config
-
타겟팅 섹션에서 다음과 같이 수행합니다.
- 목록에서 앱을 선택합니다.
- 실험에 포함할 사용자 수를 지정합니다.
- 로깅을 시작한 활성화 이벤트를 선택합니다(이 예시에서는 nondefault_model_downloaded입니다).
-
목표 섹션에 있는 목표 측정항목 목록에서 이전 섹션을 통해 결정한 목표 측정항목(이 예시에서는 first_result_opened입니다)을 선택하고 구매 수익 또는 오류를 경험하지 않은 사용자 등 추적할 측정항목을 추가로 선택합니다.
-
변수 섹션에서 변수 2개를 정의합니다.
- 통제그룹(자동으로 생성됨)
- 실험용 식물 라벨러
통제그룹에 대한
plant_labeler_model
매개변수를 만들고plant_labeler_v1
으로 설정합니다. 통제그룹에 할당된 사용자는 이전 모델을 사용하게 됩니다. 앱에서 원격 값을 사용하는지 테스트 중이므로 매개변수를(no change)
로 설정하면 안 됩니다.실험용 식물 라벨러 변수에서는
plant_labeler_model
매개변수를plant_labeler_v2
(이 이름으로 새 모델을 게시한 경우)로 설정합니다. 이 대안에 할당된 사용자는 새 모델을 사용하게 됩니다.
실험을 시작한 다음 2~3일 후 A/B Testing가 주요 변수를 선언합니다. 실험에서 주요 변수를 결정하지 못하면 더 많은 사용자를 대상으로 실험 범위 확대하기
4. 가장 우수한 변수를 모든 사용자에게 적용
A/B Testing에서 선두를 판명하기에 충분한 정보(이 경우 상위 검색결과 클릭수가 극대화되는 대안)를 수집하면 가장 효과적인 대안(또는 다른 대안)을 모든 사용자에게 적용할지 결정할 수 있습니다.
Firebase 콘솔의 A/B Testing 섹션에서 완료된 실험의 세부정보 뷰를 엽니다. 뷰에서 목표 측정항목 및 선택한 보조 측정항목에 따른 각 대안의 성과를 확인할 수 있습니다. 이 정보를 근거로 선두를 기록한 변수 또는 다른 변수의 전체 적용 여부를 결정할 수 있습니다.
모든 사용자에게 변수를 적용하려면 실험의 세부정보 페이지에서 more_vert > 변수 적용을 클릭합니다. 그러면 모든 사용자의 plant_labeler_model
매개변수 값이 plant_labeler_v2
가 됩니다.
이후의 앱 업데이트에서는 plant_labeler_model
매개변수의 기본값을 plant_labeler_v2
로 변경하고 번들 모델을 사용하는 경우 번들 모델을 업데이트해야 합니다. 사용자가 이미 최신 모델을 사용 중이므로 다음 기능 업데이트 시기 등 편의에 따라 언제든지 게시된 앱의 일부로 업데이트를 푸시하면 됩니다.