Автоматизирайте работния процес за изграждане, валидиране и внедряване на модели за машинно обучение.

Нека бъдем честни, повечето проекти за машинно обучение обикновено започват с ръчни работни процеси. Това е добре и няма повод за притеснение.

Но в един момент ще искате да се съсредоточите върху нови модели, вместо да поддържате съществуващите. Това е мястото, където TensorFlow Extended (TFX) блести.

TFX ще ви помогне да издигнете своя ML работен процес до следващото ниво: Автоматизиран тръбопровод от край до край, който позволява мащабиране на машинното обучение.

Тази статия ще ви преведе през жизнения цикъл на тръбопровод за машинно обучение с TFX.

Какво е TensorFlow Extended (TFX)?

Ако сте нов в TensorFlow Extended, препоръчвам статия от един от моите колеги, Дарън, който написа „страхотно въведение в TFX“.

Tensorflow Extended (TFX) е предназначен за изграждане на тръбопроводи за машинно обучение от край до край.

Първият път, когато прочетох за TFX, беше през 2019 г. (годината, в която беше официално пуснат за обществеността). Да си призная, беше доста поразително.

Вместо това, разбирайки частите стъпка по стъпка, ще получите ясно и лесно разбиране за това как може да се използва TFX.

Сигурен съм, че ще стигнете до момент, в който смятате, че TFX е незавършен. В такъв случай помислете, че номерът на версията на TFX все още започва с нула (0.27.0). Ако някога сте искали да бъдете част от нещо от самото начало, TFX е вашият начин да се включите.

TensorFlow Extended (TFX) не е нещо, през което преминавате между две кафета. Извличането на ползите от TFX е като отглеждането на домати, просто е, но отнема време 🍅.

Обещавам, до края на тази публикация ще се запитате „Защо не използвах TFX много по-рано?“

Недостатъци на базово внедряване на ML

Тази статия е втората от поредица статии за решения за машинно обучение от край до край. В първата статия, която беше за извършване на анализ на настроението в Google Cloud, ние покрихме основна архитектура, която е достатъчна, ако започвате да пускате първоначално ML решение.

Нека обобщим някои от неоптималните аспекти на предишното ни решение:

  • Това е ръчен процес.
  • Не е включено валидиране или проследяване (производителност на модела във времето)
  • Предварителна обработка в две отделни части на нашето приложение
  • Ръчно обучение и внедряване
  • Без автоматично обучение
  • Няма проследяване на артефакти
  • Сервирането включва ненужна обвивка на API на Python поради предварителна обработка

Нека подобрим това, като изградим конвейер с TensorFlow Extended.

Преминете директно към бележника и кодирайте

Пълният код на TensorFlow Extended тръбопровод е покрит в бележник на Colab. Ние покриваме всеки от разделите в този бележник заедно с тази статия. В края на всеки компонент можете да преминете директно към съответния код.

Използваме TensorFlow Extended 0.28.0. Ако използвате по-ниска версия, може да са необходими адаптации. В бъдеще, ако използвате по-нова версия на TFX и нещо в този бележник изглежда повредено или остаряло, уведомете ме.



Къде да стартирате TensorFlow Extended Pipelines

Преди да изградя нашия TensorFlow Extended тръбопровод, искам да покажа различните опции за изпълнение на тръбопровода.

Първоначална разработка и POCs

Преносимите компютри са чудесен начин за първоначална разработка и POC. TFX предоставя този точен случай на употреба InteractiveContext. Активирането на това е необходимо, за да може тръбопроводът да работи, без да е необходимо да правите по-разширена конфигурация.

from tfx.orchestration.experimental.interactive.interactive_context import InteractiveContext
context = InteractiveContext()

Изпълнението на нашите компоненти с InteractiveContext също ни позволява да покажем изхода на всеки компонент.

context.run(example_gen)

Проверете изхода след всеки компонент, за да разберете какъв вид метаинформация се предава на следващия компонент.

Производство

Когато говорим за това къде да стартираме нашия TensorFlow Extended Pipeline в производството, говорим за оркестрация. Кой метод на оркестрация ще използвате зависи от вашия опит и текущата ви инфраструктура.

Ето няколко примера:

  • Apache Beam
  • Apache Airflow
  • AI Platform Pipelines (лесен за стартиране)
  • Kubeflow (пълноценно решение)

Използването на TFX като част от Orchestrator (Kubeflow) е разгледано в предстоящата ни статия. Както винаги, стъпка по стъпка.

Първи стъпки с TensorFlow Extended

Преглед на компонентите на TFX

TensorFlow Extended е изграден от различни компоненти. Всеки компонент решава уникална задача на вашето решение за машинно обучение.

Общ преглед на библиотеките на TFX

Освен това тези компоненти използват различни библиотеки. За да извлечете максимума от TensorFlow Extended, трябва да имате разбиране за всяка от тези библиотеки. Не се притеснявайте, в крайна сметка ще го направите, ако следвате.

Тези библиотеки са интегрирани в TFX компонентите, но можете също да ги използвате като самостоятелни библиотеки. Нека да ги разгледаме:

ML метаданни

Библиотека за съхраняване и извличане на метаданните, които нашият конвейер произвежда. Метаданнитеса изходните данни на всеки от нашите компоненти. Това може да бъде информация като хиперпараметър, местоположение на данните, показатели на модела. По принцип всичко се съхранява в база данни. Някога чудили ли сте се колко добре се представя най-новият ви модел в сравнение с внедрения в момента? Е, с ML Metadata този тип информация се съхранява.

Валидиране на данни TensorFlow (TFDV)

Библиотека за анализиране и валидиране на данни. Ние разглеждаме това като част от компонента ExampleValidator.

TensorFlow Transform (TFT)

Това е за проектиране на функции и предварителна обработка на вашите данни като част от тръбопровода за машинно обучение. Ние разглеждаме това като част от компонента Transformer.

Анализ на модел на TensorFlow (TFMA)

Когато оценявате обучения си модел или го сравнявате с вече обучени модели. Ние разглеждаме това като част от компонента Оценител.

Следващата диаграма очертава как са свързани компонентите. Искам да подчертая, че не е необходимо да се използват всички.

Знам, че това може да изглежда много, но ви обещавам, че е много по-лесно, отколкото изглежда.

Как да използвате всеки TFX компонент

Докато преминаваме през всеки от компонентите, следваме ясна структура.

  • Въведение в по-високата задача, която всеки компонент изпълнява.
  • Разбиране на входа и изхода на компонента.
  • Разбиране как са свързани компонентите.
  • И накрая, ние очертаваме допълнителни опции и функции, които предлага всеки компонент.
  • В края на всеки компонент сиво поле ще ви отведе до кода на нашия преносим компютър и документацията за този конкретен компонент. Съветвам ви да проверите документацията за всеки компонент и след това да се върнете към тази статия.

Като този:

Jump to ExampleGen documentation and notebook.

Получаване на данните с ExampleGen

Както винаги, машинното обучение започва със събиране на данни. Нашият първи компонент се използва за получаване на нашите данни в нашия TensorFlow Extended тръбопровод.

Компонентът ExampleGen, както подсказва името, генерира TFRecords, съдържащи данните като примери на TensorFlow. TFRecords увеличава производителността на вашия конвейер и следователно времето за обучение на вашия модел.

ExampleGen може също да се използва за разделяне на данните в набори от данни за обучение и оценка.

Данните могат да се четат от различни източници и типове данни (локално, отдалечено и бази данни):

  • CsvExampleGen
  • FileBasedExampleGen
  • ImportExampleGen (TFRecords)
  • PrestoExampleGen
  • BigQueryExampleGen

Ако имате нужда от допълнителни източници, можете да внедрите свои собствени или да конвертирате данните си в TFRecords и да продължите с ImportExampleGen.

От нашия „пример за анализ на настроението“ данните се съхраняват като CSV в Google Cloud Storage Bucket. Ето защо ние използваме CsvExampleGen.

from tfx.components.example_gen.csv_example_gen.component import CsvExampleGen
example_gen = CsvExampleGen(input_base='/content/data')

По подразбиране ExampleGen ще раздели данните в съотношение 3:2 за наборите за обучение и оценка. Ако имате нужда от друго разделяне като обучение/оценка/тест, можете да го направите.

output = example_gen_pb2.Output(
split_config=example_gen_pb2.SplitConfig(splits=[
   example_gen_pb2.SplitConfig.Split(name='train', hash_buckets=8),
   example_gen_pb2.SplitConfig.Split(name='eval', hash_buckets=1),
   example_gen_pb2.SplitConfig.Split(name='test', hash_buckets=1)
]))

За да четем от Google Cloud Storage или AWS S3, ние дефинираме външен вход и го използваме по същия начин.

from tfx.utils.dsl_utils import external_input
examples = external_input("gs://machine-learning-samples/datasets/sentiment/imdb/tfx")
example_gen = CsvExampleGen(input=examples)

Както можете да видите, дори първият ни компонент е доста гъвкав и покрива голям набор от възможности. Това важи за всички компоненти. Не е необходимо да сте запознати с всички опции в началото. Ще влезете в него с времето.

Това е първият компонент, който разгледахме. След всеки компонент препоръчвам да се запознаете с документацията и примерния код в нашия бележник.

Jump to ExampleGen documentation and notebook

Познайте вашите данни със StatisticsGen

Компонентите StatisticsGen ви дават преглед на вашите данни. Това е супер полезно за посочване на небалансирани набори от данни. Например намиране на липсващи данни с помощта на хистограми; или идентифициране на минимални, максимални стойности и разпределение на данни. Използвайте StatisticsGen, за да сравните вашия набор от данни за обучение и валидиране и вижте дали и двете представят добре вашия набор от данни.

Това е моментът, в който може да се наложи да започнем да коригираме данните, преди да продължим да обучаваме модел.

statistics_gen = components.StatisticsGen(
examples=example_gen.outputs['examples'])

Разглеждайки нашия „набор от данни за настроенията“, можем да видим, че етикетите са равномерно разпределени между положителни и отрицателни настроения в набора от данни за обучение и валидиране.

Jump to StatisticsGen documentation and notebook

Не предполагайте; Знайте какво да очаквате със SchemaGen

Компонентът SchemaGen генерира схема на вашите данни, като използва статистическите данни, които получавате след използване на StatisticsGen. Схемата описва какви са правилните данни. Това е полезно за откриване на грешки и промени във вашия набор от данни.

Нашият набор от данни за настроенията се състои от две функции, преглед (действителният текст на отзива) и етикет. Етикетите се представят като цели числа, където 0 е отрицателно, а 1 е положително. Този факт се съхранява в схемата. Ако по някаква причина нашите базови набори от данни променят етикета на positive и negative като стойности на низ вместо int, можем незабавно да открием това (стигаме до това със следващия компонент).

Този компонент понякога се пренебрегва, но не можете просто да направите предположението за коректност на данните. Трябва да го докажеш.

from tfx.components import SchemaGen
schema_gen = SchemaGen(
   statistics=statistics_gen.outputs['statistics'],
   infer_feature_shape=True
)

Автоматичното генериране на схема използва евристика и е силно препоръчително да адаптирате схемата, ако е необходимо. Имате познания за домейна и трябва да ги използвате, за да промените схемата според вашия опит.

В нашия набор от данни имаме 0 и 1 като етикети. Чрез „дефиниране на домейн“ за нашия етикет на функция, можем да смекчим проблемите с грешни етикети. Ако нашите етикети не са 0 или 1, тръбопроводът ще предизвика аномалия.

label_int_domain = schema_pb2.IntDomain(min=0, max=1)
tfdv.set_domain(schema, "label", label_int_domain)

Друга причина за адаптиране на схемата може да бъде конфигуриране на допълнителни валидации като дрейф или изкривяване. Ще разгледаме повече това в следващия раздел.

Jump to SchemaGen documentation and notebook

Идентифицирайте аномалии с ExampleValidator

Компонентът ExampleValidator преглежда нашите данни и търси аномалии. В момента ExampleValidator проверява за ~80 вида аномалии, включително:

  • Неочаквани видове
  • Без ценности
  • Неочаквани стойности (като нашия дефиниран домейн за нашите етикети)
  • Новите колони не са известни в схемата
  • Няма достатъчно примери
  • Средна дължина на низа (чудесно за нашия текст за преглед)
  • Дрейф / Изкривяване

Има различни видове дрейф и изкривяване. Някои от тях изискват конфигурация въз основа на познанията ви за домейна. Ще разгледаме това в предстояща статия за това как да използвате ефективно TFX в производството. С две думи, трябва да актуализираме нашата схема и да дефинираме skew_comparator или drift_comparator

Ако се интересувате от пълния списък на поддържаните аномалии, вижте Хранилището на GitHub. Не забравяйте, че някои от аномалиите може да изискват допълнителна конфигурация.

В случай на аномалия, тръбопроводът ще спре и ще получи съобщение за неуспешен статус. Имайте предвид, че не всички възможни аномалии са обхванати.

from tfx.components import ExampleValidator
example_validator = ExampleValidator(
    statistics=statistics_gen.outputs['statistics'],
    schema=schema_gen.outputs['schema']
)

Препоръчваме внедряване на ваш собствен компонент за интегриране на аномалии, които ExampleValidator не покрива.

Jump to ExampleValidator documentation and notebook

Трансформирайте данните си с „Трансформиране“

Transform е компонентът за инженеринг на функции на TensorFlow Extended. Данните трябва да бъдат предварително обработени, преди моделът за машинно обучение да може да ги използва. Този компонент се грижи за предварителната обработка като част от тръбопровода.

В сърцето на Transform е функцията preprocessing_fn като част от нашия код за трансформация.

Една важна точка, която трябва да разберете: Transform използва библиотеката TensorFlow Transform, която генерира графика TensorFlow. Когато работите с графики на TensorFlow, са разрешени само TFOperations. Това означава, че когато внедрявате своя код за трансформация, имате право да използвате само операции на TensorFlow. По мое мнение това е може би най-сложната част от нашия пълен TensorFlow Extended тръбопровод.

Ако започвате, кодът ви за трансформация вероятно се състои от различни функции на Python. Запознайте се с всички операции на TensorFlow.

Вземете текущите си трансформации и ги внедрете стъпка по стъпка като TF операции. В един момент просто ви се струва естествено да използвате TF Operations.

Може да се запитате: „Защо толкова сложно?“ Има основателна причина да искате да интегрирате вашата трансформация като част от вашия модел. Вие смекчавате грешките, като използвате същата логика на предварителна обработка като част от обучението и обслужването. И ще увеличите производителността, като използвате силно оптимизирани операции на TensorFlow.

Jump to Transform documentation and notebook

Обучете модела с Trainer

И накрая, обучаваме нашия модел TensorFlow с помощта на компонента Trainer. Trainer използва трансформираните данни, графиката на трансформация, спомената в предишната статия, и кода на треньора.

Ако приемем, че нашите данни вече са трансформирани, можете директно да използвате примерите от компонента ExampleGen. Както виждате, тръбопроводът е доста гъвкав.

Той съдържа целия необходим код за обучение на вашия модел и подготовката му за прогнози. Trainer извиква обучителния модул, Python модул, единичен файл (или файлове), съдържащ нашия код за обучение. Обучителят ще потърси функция с имеrun_fn и ще я изпълни. Тази функция обикновено има следните задачи:

  • Заредете предварително обучения модел
  • Изградете модела
  • Поставете модела
  • Определете сигнатурата на модела
  • Запазете модела
trainer = Trainer(
    module_file=os.path.abspath("trainer.py"),
    custom_executor_spec=executor_spec.ExecutorClassSpec   (GenericExecutor),
    examples=transform.outputs['transformed_examples'],
    transform_graph=transform.outputs['transform_graph'],
    schema=schema_gen.outputs['schema'],
    train_args=trainer_pb2.TrainArgs(num_steps=TRAINING_STEPS),
   eval_args=trainer_pb2.EvalArgs(num_steps=EVALUATION_STEPS)
)

Компонентът Transformer се използва два пъти в нашия компонент Trainer. Ние използваме вече предварително обработените данни по време на обучение и това ни помага да намалим времето за обучение. Не е необходимо да обработваме предварително данните по време на обучението.

tf_transform_output = tft.TFTransformOutput(fn_args.transform_output)

Освен това ние вземаме графиката на Transformer на нашата логика за предварителна обработка на трансформация и я интегрираме в нашия модел за обслужване.

model.tft_layer = tf_transform_output.transform_features_layer()

Обучителят не се ограничава до местната среда. Можем да настроим нашия „компонент Trainer да използва Google Cloud AI Platform Training“. Провеждането на обучението на AI Platform е страхотно, ако използвате продукт като AI Platform Pipelines, по този начин можете да използвате GPU, без да е необходимо да променяте основния клъстер на Kubernetes.

Jump to Transform documentation and notebook

Достъп до вашия модел и данни с Resolver

Резолверът е компонент, който обработва разрешаването на артефакти. С други думи, начин за достъп до нашия модел, данни или други артефакти.

Най-честите случаи на употреба са:

  • Зареждане на предишен модел за сравнение с текущия модел. Ще използваме това за следващия ни компонент, Оценител.
  • Зареждане на модел за загряване, стартиране на обучение (не е обхванато в тази статия).

Резолверът е важна част от автоматизацията на ML, защото можете да разрешавате артефакти от минали изпълнения. Внедряването на ваш собствен Resolver ви дава гъвкавост и дори можете да го използвате за разрешаване на конкретни части от вашите данни за обучение.

Извод: Общността на TensorFlow играе огромна роля в неговото развитие. Има куп RFC (документи, които описват нови функции, които общността може да предложи).

Компонентът Resolver е „един от тях“.

Тези документи са чудесен начин да разберете по-задълбочено предназначението на компонентите и функциите на TensorFlow.

В нашия следващ компонент компонентът Evaluator използва предварително обучен модел, за да го сравни с текущо обучения модел. За целта използваме компонента Resolver, за да получим „най-новия благословен (одобрен) модел“.

model_resolver =  Resolver(
    instance_name= "latest_blessed_model_resolver",
    strategy_class=   latest_blessed_model_resolver.LatestBlessedModelResolver,
    model=Channel(type=Model),
    model_blessing=Channel(type=ModelBlessing)
)

Имайте предвид, че повечето статии все още използват вече отхвърления „ResolverNode“, който беше отхвърлен с версия „0.27.0“.

Не забравяйте да използвате новия компонент Resolver. Документацията на TFX все още изостава от документацията за това, но невероятната TFX общност вече е наясно с това и работи за подобряването му.

Jump to Evaluator documentation and notebook

Оценете своя модел с Оценител

Моделът е обучен, но преди да можете да го включите в производство, трябва да знаете как моделът се представя на вашите данни. Тази стъпка е известна като Анализ. Оценителят използва Анализ на модела TensorFlow, за да оцени модела.

И може дори да искате да знаете дали вашият нов модел е по-добър от предишния модел, който сте тренирали. Тази стъпка се нарича Проверка.

Оценителят изисква конфигурация. Трябва да определите как да оцените вашия модел. Освен това се нуждае от вашия текущо обучен модел и последния обучен модел за сравнение. За да получите последния обучен модел — нашия базов модел — използвате компонента Resolver, разгледан в предишния раздел.

evaluator = Evaluator(
    examples=example_gen.outputs['examples'],
    model=trainer.outputs['model'],
    baseline_model=model_resolver.outputs['model'],
    eval_config=eval_config
)

За да изпълните оценката, трябва да дефинирате няколко спецификации като част от конфигурацията.

eval_config = tfma.EvalConfig(
    model_specs   = [tfma.ModelSpec(...)],
    slicing_specs = [tfma.SlicingSpec(...)]
    metrics_specs = [tfma.MetricsSpec(...)]
)

Спецификации на модела

„Спецификациите на модела“ се използват за предоставяне на допълнителна информация за нашия модел. Обикновено трябва да дефинирате поне името на функцията, съдържаща етикетите. В случай, че сте променили сигнатурата за обслужване на вашия модел, ние също трябва да дефинираме това.

model_specs=[
    tfma.ModelSpec(label_key='label')
]

Спецификации за нарязване

Нарязването не е нищо друго освен вземане на нашите данни и поставянето им в множество кофи въз основа на функция или стойност. След това показателят може да бъде изчислен върху тези различни части от данни. Представете си набор от данни, където имате часове от деня като част от вашите данни. Може да се интересувате колко добре се представя нашият модел за различни часове от деня. По този начин можете да идентифицирате часове, в които вашият модел не се представя добре.

Ние не дефинираме никакви срезове за нашия набор от данни и използваме целия набор от данни за изчисляване на показателите.

slicing_specs=[
    tfma.SlicingSpec()
]

Спецификации на показателите

Ако не предоставим никакви допълнителни показатели, Оценителят (TFMA) ще използва показателите за обучение. Има много „метрики“, които можете да използвате и те зависят от проблема с машинното обучение, който решавате. На по-високо ниво можете да разделяте метрики на Keras и метрики за анализ на модел на TensorFlow.

metrics_specs=[
    tfma.MetricsSpec(metrics=[        
       tfma.MetricConfig(class_name='ExampleCount'),
       tfma.MetricConfig(class_name='CategoricalAccuracy',
       ...
    ]
]

Освен това можете да дефинирате прагове за вашите метрики.

Има два вида прагове:

  • GenericValueThreshold:Това се използва за оценка дали показателят на текущия модел е поне по-голям от дефинирана стойност (долна граница за показатели като AUC) или по-малък от дефинирана стойност (горна граница за показатели като загуба).
threshold=tfma.MetricThreshold(
   value_threshold=tfma.GenericValueThreshold( 
      lower_bound={'value': 0.7}
   )
)
  • GenericChangeThreshold: Това се използва за сравняване на различни кандидати за модели, като например текущия модел, с предишния модел. С това проверяваме дали показателят на текущия модел е по-голям или по-малък от предишния модел.
threshold=tfma.MetricThreshold(
    change_threshold=tfma.GenericChangeThreshold(
        direction=tfma.MetricDirection.HIGHER_IS_BETTER, 
        absolute={'value': 0.0001}
    )
)

Като стартираме компонента Evaluator, който току-що конфигурирахме, имаме автоматичен процес за решаване дали искаме да пуснем модела в производство.

Ако моделът отговаря на нашите дефинирани показатели, Оценителят ще благослови модела. Освен това можем да използваме потребителския интерфейс и показателите, за да разберем задълбочено ефективността на нашия модел.

Jump to Evaluator documentation and notebook

Публикувайте модела с Pusher

Pusher е последният компонент от нашия TFX тръбопровод. Необходими са Model и Validator, за да проверят дали моделът е преминал проверката и ще избутат модела до определено място.

Поддържат се различни местоположения:

  • Файлова система
  • Облачно съхранение (GCP Bucket и AWS S3)
    Страхотно, ако използвате TensorFlow Serving
  • Обслужване на Google Cloud AI Platform
  • BigQueryML
pusher = Pusher(
    model=trainer.outputs['model'],
    model_blessing=evaluator.outputs['blessing'],
    push_destination=pusher_pb2.PushDestination(
    filesystem=pusher_pb2.PushDestination.Filesystem(
    base_directory=location))
)

Чувствайте се свободни да допринесете с повече местоположения като част от този удивителен проект с отворен код. Ако сте любопитни как се изпълняват тласкачите, погледнете един от вече съществуващите тласкачи като AI Platform TFX Pusher.

Jump to Pusher documentation and notebook

Това е всичко, стигнахме до края на ML тръбопровода. Вашият модел е избутан и готов за сервиране.

Вашата обратна връзка е високо ценена, уведомете ме, ако откриете проблеми, пропуснете нещо или просто искате да поговорим.

Какво следва?

Подготвяме няколко статии, които скоро ще бъдат публикувани:

  • Първата статия използва AI Platform Pipelines и Kubeflow като наш инструмент за оркестрация за изпълнение на нашия TensorFlow Extended Pipeline.
  • Вторият обхваща обслужването на модела с помощта на TensorFlow Serving и AI Platform Prediction.
  • Третият е дълбоко гмуркане във вътрешната работа на компонентите и персонализираните компоненти за TensorFlow Extended.

Препоръка за книга

Ако искате да копаете по-дълбоко, силно препоръчвам книгатаИзграждане на тръбопроводи за машинно обучение — автоматизиране на жизнените цикли на модела с TensorFlow, написана отHannes Hapke и Catherine Nelson.



Благодаря, че прочетохте! За да останете свързани, следвайте ни в DoiT Engineering Blog, DoiT Linkedin Channel и DoiT Twitter Channel. За да проучите възможностите за кариера, посетете https://careers.doit-intl.com.