Предварительная обработка шаблонов конвейера TensorFlow с использованием tf.Transform в Google Cloud

Google искусственный интеллект TensorFlow Apache

Автор: Матиас Фейс, технический директор, ML6

Источник | Публичный аккаунт TensorFlow

Для обучения моделей машинного обучения требуются данные, но часто эти данные необходимо предварительно обрабатывать, чтобы они были полезны при обучении модели. Эта предварительная обработка (часто называемая «инженерией признаков») принимает различные формы, такие как нормализация и масштабирование данных, кодирование категориальных значений в числовые значения, формирование словарей и градация непрерывных числовых значений.

При использовании машинного обучения в производственной среде часто становится сложной задачей обеспечить, чтобы этапы разработки признаков, применяемые во время автономного обучения модели, оставались такими же, как и при использовании модели для прогнозирования. Кроме того, в современном мире модели машинного обучения обучаются на очень больших наборах данных, поэтому этапы предварительной обработки, применяемые во время обучения, будут реализованы в крупномасштабных распределенных вычислительных средах, таких как Google Cloud Dataflow или Apache Spark. Поскольку среда обучения часто сильно отличается от среды обслуживания, могут возникать несоответствия между разработкой функций, выполняемой во время обучения и обслуживания.

К счастью, теперь у нас есть tf.Transform, библиотека TensorFlow, которая предоставляет элегантное решение для обеспечения согласованности этапов разработки функций во время обучения и обслуживания. В этом посте мы предоставим конкретные примеры использования tf.Transform в Google Cloud Dataflow, а также обучение и обслуживание моделей в Cloud ML Engine. Примечание: ссылка tf.TransformGitHub.com/tensorflow/…

Преобразование вариантов использования, применяемых к машинному моделированию

ecc.ai— это платформа, которая помогает оптимизировать конфигурации машин. Мы моделируем физические машины (например, машины для наполнения бутылок или машины для производства печенья), чтобы найти более оптимальные настройки параметров. Поскольку каждая смоделированная физическая машина должна иметь те же характеристики ввода/вывода, что и реальная машина, мы называем ее «цифровым близнецом».

В этой статье будет продемонстрирован процесс проектирования и реализации этого «цифрового двойника». В последнем абзаце вы можете узнать больше о том, как мы затем используем эти цифровые двойники для оптимизации конфигураций машин. Примечание:ecc.aiСсылка на сайтecc.ai/

определение tf.Transform

tf.Transform — это библиотека для TensorFlow, которая позволяет пользователям определять шаблоны конвейера предварительной обработки и запускать эти шаблоны конвейера с использованием крупномасштабных сред обработки данных, а также экспортировать конвейеры таким образом, чтобы их можно было запускать как часть графа TensorFlow. Пользователи определяют конвейеры, комбинируя модульные функции Python, после чего tf.Transform запускается вместе с Apache Beam. Граф TensorFlow, экспортируемый tf.Transform, может воспроизводить этапы предварительной обработки при использовании обученной модели для прогнозирования, например при обслуживании модели с помощью TensorFlow Serving. Примечание. Ссылка на Apache Beambeam.apache.org/Ссылка на обслуживание TensorFlowЛюбовь. Google blog.com/2016/02/run…

tf.Transform позволяет определять пользовательские конвейеры предварительной обработки. Пользователи могут реализовать предварительно обработанные данные для обучения TensorFlow, а также могут закодировать преобразование в виде графа TensorFlow и экспортировать его. Этот преобразованный граф затем включается в граф модели для вывода.

tf.Transform создает цифрового двойника

Цель модели цифрового двойника состоит в том, чтобы иметь возможность прогнозировать все выходные параметры машины на основе ее входных данных. Чтобы обучить эту модель, мы проанализировали данные журнала, содержащие историю записей наблюдений для этой взаимосвязи. Поскольку объем данных журнала может быть довольно большим, этот шаг в идеале должен выполняться распределенным образом. Кроме того, между обучением и отбыванием наказания должны использоваться одни и те же концепции и код с минимальными изменениями в коде предварительной обработки.

В начале разработки мы не могли найти эту функцию ни в одном существующем проекте с открытым исходным кодом. Поэтому мы начали создавать собственные инструменты для предварительной обработки Apache Beam, которые позволяли нам распределять нашу рабочую нагрузку и легко переключаться между несколькими компьютерами. Но, к сожалению, этот подход не позволяет нам повторно использовать один и тот же код для запуска в составе графа TensorFlow во время обслуживания (т. е. при использовании обученной модели в продакшене).

На практике нам приходится писать собственные этапы анализа в Apache Beam, которые вычисляют и сохраняют необходимые метаданные для каждой переменной для фактической предварительной обработки на последующих этапах. Мы используем Apache Beam для выполнения последующих шагов предварительной обработки во время обучения и как часть API во время обслуживания. К сожалению, поскольку он не является частью графа TensorFlow, мы не можем просто использовать ML Engine для развертывания нашей модели в качестве API, а наш API всегда состоит из части предварительной обработки и части модели, что затрудняет унифицированные обновления. И для всех тех существующих и совершенно новых преобразований, которые мы хотим использовать, нам необходимо внедрить и поддерживать для этого этап анализа и преобразования.

TensorFlow Transform решает эти проблемы. С момента запуска мы интегрировали его напрямую в качестве основного строительного блока нашего полного шаблона конвейера.

Упрощенный пример процесса цифрового двойника

Теперь мы сосредоточимся на создании и использовании цифровых двойников конкретных машин. В качестве примера предположим, что у нас есть машина для приготовления теста для пирожных. Машина нагревает и смешивает различные ингредиенты, пока тесто не приобретет идеальную текстуру. Мы начнем с проблемы партий, что означает, что данные агрегируются по полным производственным партиям, а не по непрерывной производственной линии.

данныеУ нас есть два типа данных: Входные данные: Описание ингредиентов (зеленый цвет) и настройки тестомеса для пирожных (синий цвет). Ниже вы можете найти названия столбцов и 3 примера строк.

Выходные данные: результаты настройки машины с такими ингредиентами: потребляемая энергия, выходные показатели качества и производительность. Ниже вы можете найти названия столбцов и 3 примера строк.

Сделать цифрового двойника

Здесь мы обучаем цифрового двойника системы на исторических данных журнала из двух разных типов файлов в облачном хранилище. Цифровой двойник способен прогнозировать выходные данные на основе входных данных. На изображении выше показаны сервисы Google, которые мы используем в этом процессе.

предварительная обработкаИспользуя функцию tf.Transform, Apache Beam выполнит предварительную обработку (составляя обучающие примеры).

Этап предобработки включает 4 шага, код выглядит следующим образом:

  1. Объедините входные/выходные данные и создайте PCollection необработанных данных.
1    raw_data_input = (    
2            p    
3            | 'ReadInputData' >> textio.ReadFromText(train_data_file) 
4            | 'ParseInputCSV'>> beam.Map(converter_input.decode)
5            | 'ExtractBatchKeyIn'>> beam.Map(extract_batchkey))
6
7    raw_data_output = (    
8            p    
9           | 'ReadOutputData' >> textio.ReadFromText(train_data_file)    
10          | 'ParseOutputCSV'>> beam.Map(converter_output.decode)    
11          | 'ExtractBatchKeyOut'>> beam.Map(extract_batchkey))
12
13    raw_data = (    
14          (raw_data_input, raw_data_output)    
15          | 'JoinData' >> CoGroupByKey()    
16          | 'RemoveKeys'>> beam.Map(remove_keys))
  1. Определяет функцию предварительной обработки, которая будет предварительно обрабатывать необработанные данные. Эта функция объединит несколько функций TF-Transform для создания примера оценок TensorFlow.

Language: Python

1    def preprocessing_fn(inputs):    
2        """Preprocess input columns into transformed columns."""    
3        outputs = {}    
4        # Encode categorical column:    
5        outputs['Mixing Speed'] = tft.string_to_int(inputs['Mixing Speed'])    
6        # Calculate Derived Features:    
7        outputs['Total Mass'] = inputs['Butter Mass'] + inputs['Sugar Mass'] + inputs['Flour Mass']    
8        for ingredient in ['Butter', 'Sugar', 'Flour']:      
9                ingredient_percentage = inputs['{} Mass'.format(ingredient)] / outputs['Total Mass']       
10                outputs['Norm {} perc'.format(ingredient)] = tft.scale_to_z_score(ingredient_percentage)    
11        # Keep absolute numeric columns    
12        for key in ['Total Volume', 'Energy']:        
13                outputs[key]=inputs[key]    
14        # Normalize other numeric columns    
15        for key in [          
16                        'Butter Temperature',          
17                        'Sugar Humidity',          
18                        'Flour Humidity'          
19                        'Heating Time',          
20                        'Mixing Time',          
21                        'Density',          
22                        'Temperature',          
23                        'Humidity',      
24                ]:        
25                    outputs[key] = tft.scale_to_z_score(inputs[key])  26        # Extract Specific Problems    
27        chunks_detected_str = tf.regex_replace(        
28                inputs['Problems'],        
29                '.*chunk.*'        
30                'chunk',        
31                name='Detect Chunk')    
32        outputs['Chunks']=tf.equal(chunks_detected_str,'chunk')
33    return outputs
  1. Анализируйте и преобразовывайте целые наборы данных с помощью функций предварительной обработки. Эта часть кода возьмет функцию предварительной обработки, чтобы сначала проанализировать набор данных, т. е. передать набор данных целиком для вычисления словаря категориальных столбцов, а затем вычислить среднее значение и стандартное отклонение нормализованных столбцов. Затем выходные данные шага анализа используются для преобразования всего набора данных.
1    transform_fn = raw_data | AnalyzeDataset(preprocessing_fn)
2    transformed_data = (raw_data, transform_fn) | TransformDataset()
  1. Сохраните данные и сериализуйте файлы TransformFn и метаданных.
1    transformed_data | "WriteTrainData" >> tfrecordio.WriteToTFRecord(    
2        transformed_eval_data_base,    
3        coder=example_proto_coder.ExampleProtoCoder(transformed_metadata))
4
5    _ = (    
6        transform_fn    
7        | "WriteTransformFn" >>    
8        transform_fn_io.WriteTransformFn(working_dir))
9
10
11    transformed_metadata | 'WriteMetadata' >> beam_metadata_io.WriteMetadata(    
12            transformed_metadata_file, pipeline=p)

тренироваться

Используйте предварительно обработанные данные какTFRecords, теперь мы можем легко обучать модели TensorFlow с помощью стандартного кода TensorFlow, используя Estimators.

Экспорт обученной модели

Помимо структурированных методов анализа наборов данных, реальная сила tf.Transform заключается в том, что он может экспортировать предварительно обработанные графики. Вы можете экспортировать модель TensorFlow, которая содержит те же шаги предварительной обработки, что и обучающие данные.

Для этого нам достаточно экспортировать обученную модель с помощью функции ввода tf.Transform:

1 tf_transform_output = tft.TFTransformOutput(working_dir) 2 serving_input_fn = _make_serving_input_fn(tf_transform_output) 3 exported_model_dir = os.path.join(working_dir, EXPORTED_MODEL_DIR) 4 estimator.export_savedmodel(exported_model_dir, serving_input_fn)

Функция _make_serving_input_fn — это очень общая функция, которую вы можете просто повторно использовать в разных проектах, независимо от логики проекта:

Language: Python

1 def _make_serving_input_fn(tf_transform_output):
2 raw_feature_spec = RAW_DATA_METADATA.schema.as_feature_spec()
3 raw_feature_spec.pop(LABEL_KEY)
4 5 def serving_input_fn():
6 raw_input_fn = input_fn_utils.build_parsing_serving_input_fn(
7 raw_feature_spec)
8 raw_features, _, default_inputs = raw_input_fn()
9 transformed_features = tf_transform_output.transform_raw_features(
10 raw_features)
11 return input_fn_utils.InputFnOps(transformed_features, None, default_inputs)
12 13 return serving_input_fn

Используйте цифровых двойников

Заключительная часть примера процесса цифрового двойника использует сохраненную модель для прогнозирования выходных данных системы на основе входных данных. Именно здесь мы можем воспользоваться преимуществами tf.Transform, поскольку он позволяет очень легко развернуть «TrainedModel» (включая предварительную обработку) в Cloud ML Engine.

Чтобы развернуть обученную модель, вам достаточно выполнить 2 команды:

1    gcloud ml-engine models create MODEL_NAME
2    gcloud ml-engine versions create VERSION --model=MODEL_NAME --origin=ORIGIN

Теперь мы можем легко взаимодействовать с нашим цифровым двойником, используя следующий код

1    def get_predictions(project, model, instances, version=None):    
2        service = discovery.build('ml', 'v1')    
3        name = 'projects/{}/models/{}'.format(project, model)    
4
5        if version is not None:        
6                    name += '/versions/{}'.format(version)    
7
8        response = service.projects().predict(        
9                name=name,        
10                body={'instances': instances}    
11            ).execute()    
12
13            if 'error' in response:        
14                raise RuntimeError(response['error'])
15 
16            return response['predictions']
17
18
19    if __name__ == "__main__":    
20            predictions = get_predictions(        
21                project="<project_id>",        
22                model="<model_name>",        
23                instances=[            
24                        {                  
25                                    "Butter Mass": 121,
26    "Butter Temperature": 20,
27    "Sugar Mass": 200,
28    "Sugar Humidity": 0.22,
29    "Flour Mass ": 50,
30    "Flour Humidity": 0.23,
31    "Heating Time": 50,
32    "Mixing Speed": "Max Speed",
33    "Mixing Time": 200            
34                        }]    
35            )

существуетecc.ai, мы используем цифрового двойника для оптимизации параметров физической машины.

Вкратце, наш метод состоит из 3 шагов (показанных на рисунке 1 ниже):

Создавайте смоделированные среды, используя исторические машинные данные. Затем этот «цифровой двойник» машины будет служить средой, которая позволит расширенному агенту изучить оптимальную политику управления. Используйте цифрового двойника, чтобы найти (новые) оптимальные настройки параметров с помощью нашего агента обучения с подкреплением (RL). Настройте параметры реальной машины с помощью агента RL.

Суммировать

С помощью TF.Transform мы теперь развернули нашу модель на ML Engine Engine как API, став цифровым близнецом специфического машины для теста. Отказ

Преимущество в том, что нам не нужно поддерживать API и иметь все необходимое, поскольку предварительная обработка является частью графа обслуживания. Если нам нужно обновить API, просто обновите модель до последней версии, и все соответствующие шаги предварительной обработки будут обновлены для вас автоматически.

Кроме того, если нам нужно сделать цифровой двойник другой машины для производства теста для пирожных (которая использует тот же формат данных), но на другой фабрике или в другой установке, мы также можем легко повторно запустить тот же код без ручных настроек. Предварительно обработать код или выполнить настраиваемые этапы анализа.

Вы можете найти код этой статьи на GitHub. Примечание: ссылка на GitHubGitHub.com/FEMA представляет/Тайфун…