BigQuery ML теперь поддерживает TensorFlow SavedModel

Если вы обучили модель в TensorFlow и экспортировали ее как SavedModel, теперь вы можете использовать SQL-функцию ML.PREDICT в BigQuery для прогнозирования. Это очень полезно, если вы хотите делать пакетные прогнозы (например, делать прогнозы для всех данных, собранных за последний час), поскольку любой запрос SQL можно запланировать в BigQuery.

Шаги:

  • Обучить и экспортировать сохраненную модель в TensorFlow
  • В BigQuery создайте модель, указав местоположение сохраненной модели.
  • Используйте ML.EVALUATE, ML.PREDICT и т. Д. Так же, как если бы вы обучили модель в BigQuery, используя другие (встроенные) типы моделей.

Примечание: эта функция в настоящее время находится на общедоступной альфа-версии. Чтобы попасть в белый список, обратитесь к своему представителю GCP.

1. Обучите и экспортируйте SavedModel в TensorFlow / Keras

Я продемонстрирую использование модели классификации текста, которую я описываю в этом сообщении в блоге и для которой код Keras находится на GitHub. Я обучал модель на Cloud ML Engine, но вы можете тренировать ее где угодно и как хотите. Важным моментом является строка для экспорта модели как сохраненной модели в Google Cloud Storage:

exporter = tf.estimator.LatestExporter('exporter', serving_input_fn)

2. Создать модель

Для создания модели в BigQuery достаточно указать другой тип_модели и указать его на путь_модели, куда был экспортирован SavedModel (обратите внимание на подстановочный знак в конце, чтобы выбрать ресурсы, словарь и т. Д.):

CREATE OR REPLACE MODEL advdata.txtclass_tf
OPTIONS (model_type='tensorflow',
         model_path='gs://cloud-training-demos/txtclass/export/exporter/1549825580/*')

Я сделал указанную выше корзину общедоступной, поэтому вы можете опробовать приведенный выше запрос как есть (сначала создайте набор данных с именем advdata). Это создает модель в BigQuery, которая работает как любая встроенная модель:

В частности, схема указывает, что требуемый ввод в модель называется «вводом» и является строкой.

3. Прогнозирование с помощью модели

Прогнозировать с помощью модели довольно просто. Например, мы можем извлечь некоторые данные из нашей таблицы BigQuery и убедиться, что в нашем выборе мы называем наши столбцы в зависимости от того, что требует TensorFlow. В этом случае serv_input_fn моей модели TensorFlow указывает, что модель ожидает единственную входную строку, называемую «input».

Учитывая это, теперь мы можем сделать прогноз:

WITH extracted AS (
SELECT source, REGEXP_REPLACE(LOWER(REGEXP_REPLACE(title, '[^a-zA-Z0-9 $.-]', ' ')), "  ", " ") AS title FROM
  (SELECT
    ARRAY_REVERSE(SPLIT(REGEXP_EXTRACT(url, '.*://(.[^/]+)/'), '.'))[OFFSET(1)] AS source,
    title
  FROM
    `bigquery-public-data.hacker_news.stories`
  WHERE
    REGEXP_CONTAINS(REGEXP_EXTRACT(url, '.*://(.[^/]+)/'), '.com$')
    AND LENGTH(title) > 10
  )
)
, input_data AS (
  SELECT title AS input FROM extracted limit 5
)
SELECT *
FROM ML.PREDICT(MODEL advdata.txtclass_tf, 
               (SELECT * FROM input_data))

Это дает результат:

Зная фактические метки, мы можем улучшить фактический запрос:

SELECT
  input,
  (SELECT AS STRUCT(p, ['github', 'nytimes', 'techcrunch'][ORDINAL(s)]) prediction FROM
    (SELECT p, ROW_NUMBER() OVER() AS s FROM
      (SELECT * FROM UNNEST(dense_1) AS p)) 
  ORDER BY p DESC LIMIT 1).*
FROM ML.PREDICT(MODEL advdata.txtclass_tf,
(
SELECT 'Unlikely Partnership in House Gives Lawmakers Hope for Border Deal' AS input
UNION ALL SELECT "Fitbit\'s newest fitness tracker is just for employees and health insurance members"
UNION ALL SELECT "Show HN: Hello, a CLI tool for managing social media"
))

Обратите внимание, что этот предоставляет значения непосредственно в SQL. Результат:

Вот и все!