FBLearner Flow

facebook-ai

이미지출처: 페이스북

얼마전에 페이스북이 사용하고 있는 머신러닝 플랫폼에 대한 간단한 설명을 담은 기사가 보도되었습니다. 이 기사에서는 Flow, AutoML 같은 용어들이 언급되었었는데요. 기사에 언급된 AutoML을 가지고 AI 를 만드는 AI 라고 좀 자극적인 타이틀이 달렸습니다. AutoML은 어제 소개해드린 TPOT과 같은 피처 엔지니어링(feature engineering)이나 모델 셀렉션(model selection)을 자동화해주는 툴로 예상됩니다.

페이스북이 어제 자사의 머신러닝 플랫폼인 FBLearner Flow에 대한 소개 글인 ‘Introducing FBLearner Flow: Facebook’s AI backbone‘를 블로그에 올렸습니다. 위 기사의 Flow가 바로 어제 공개된 FBLearner Flow입니다.

페이스북은 머신러닝을 이용하는데 알고리즘보다 피처 엔지니어링이나 하이퍼파라메타(hyperparameter) 튜닝에 훨씬 많은 시간이 필요하다는 것을 알았습니다. 여러가지 방식으로 많은 실험을 해보려면 이전의 설정이나 워크플로우가 저장되고 공유되는 것이 유익합니다. FBLearner Flow는 이런 요구사항을 반영하여 재사용 가능한 알고리즘과 워크플로우, 엔지니어간의 공유, 병렬처리가 가능한 플랫폼으로 만들어 졌습니다. 현재 동시에 수천개의 머신러닝 태스크가 운영되고 있으며 지금까지 백만여개의 모델이 훈련되었고 초당 6백만개의 예측결과를 만들어 내고 있습니다. 대략 페이스북 개발팀의 25%가 사용하고 있다고 하네요.

블로그에서 iris 데이터셋을 이용한 의사결정트리의 맛보기 코드를 살짝 보여 주었는데요. 조금 놀라운 건 페이스북이 파이썬을 사용했다는 것 입니다.

# The typed schema of the Hive table containing the input data
feature_columns = (
    ('petal_width', types.INTEGER),
    ('petal_height', types.INTEGER),
    ('sepal_width', types.INTEGER),
    ('sepal_height', types.INTEGER),
)
label_column = ('species', types.TEXT)
all_columns = feature_columns + (label_column,)

# This decorator annotates that the following function is a workflow within
# FBLearner Flow
@workflow(
    # Workflows have typed inputs and outputs declared using the FBLearner type
    # system
    input_schema=types.Schema(
        labeled_data=types.DATASET(schema=all_columns),
        unlabeled_data=types.DATASET(schema=feature_columns),
    ),
    returns=types.Schema(
        model=types.MODEL,
        mse=types.DOUBLE,
        predictions=types.DATASET(schema=all_columns),
    ),
)
def iris(labeled_data, unlabeled_data):
    # Divide the dataset into separate training and evaluation dataset by random
    # sampling.
    split = SplitDatasetOperator(labeled_data, train=0.8, evaluation=0.2)

    # Train a decision tree with the default settings then evaluate it on the
    # labeled evaluation dataset.
    dt = TrainDecisionTreeOperator(
        dataset=split.train,
        features=[name for name, type in feature_columns],
        label=label_column[0],
    )
    metrics = ComputeMetricsOperator(
        dataset=split.evaluation,
        model=dt.model,
        label=label_column[0],
        metrics=[Metrics.LOGLOSS],
    )

    # Perform predictions on the unlabeled dataset and produce a new dataset
    predictions = PredictOperator(
        dataset=unlabeled_data,
        model=dt.model,
        output_column=label_column[0],
    )

    # Return the outputs of the workflow from the individual operators
    return Output(
        model=dt.model,
        logloss=metrics.logloss,
        predictions=predictions,
    )

iris 함수 위에 @workflow 데코레이터가 보입니다. 데코레이터에서 입력 값과 리턴 값의 스키마를 정의하고 있습니다. 텐서플로우와 마찬가지로 코드는 그래프를 구성(DAG compilation)하는 것으로 실제 실행은 사용 가능한 시스템의 자원을 자동으로 찾아 할당되어 처리됩니다. FBLearner Flow의 오퍼레이터(Operator)는 실제 연산이 되어야 할 정보를 담은 Future 오브젝트를 리턴합니다. 위 코드에서 dt, metrics, predictions이 Future 오브젝트입니다.

FBLearner Flow는 이러한 워크플로우와 태스크를 관리하는 UI도 포함하고 있습니다.

FBLearner Flow 에서 사용하고 있는 알고리즘은 아래와 같습니다. 앞으로도 계속 추가할 예정인데 페이스북 개발자가 직접 자신만의 알고리즘을 작성하여 넣을 수 있다고 합니다. 그리고 다음 달에 더욱 자세한 내용을 발표할 예정이라고 합니다.

  • Neural networks
  • Gradient boosted decision trees
  • LambdaMART
  • Stochastic gradient descent
  • Logistic regression

머신러닝이나  인공지능이 알고리즘을 연구하고 발전시키는 단계에서 조립하여 사용하는 것에 촛점을 맞춘 워크플로우 플랫폼을 구축하는 단계로 빠르게 변화하는 것 같습니다. 이는 페이스북 뿐만이 아니라 구글을 비롯한 여러 클라우드 기반 머신러닝 시스템이 시사하는 바 입니다.

페이스북이 FBLearner Flow를 오픈소스로 공개할까요? 페이스북은 이에대해 별다른 언급이 없지만 특별한 부정도 없습니다. 분명한 것은 FBLearner Flow는 페이스북 인프라스트럭처에 타이트하게 연결되어 있을 것이고 이를 분리하여 오픈소스화 하는 것이 간단하지만은 않을 것 입니다. 하지만 마음만 먹는다면 얼마든지 가능하리라는게 일반적인 시각입니다. 오래지 않아 페이스북이 오픈소스로 공개해주길 바래 봅니다. 🙂

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중