Пакетное преобразование разреженной матрицы с помощью AWS SageMaker Python SDK - PullRequest
1 голос
/ 16 октября 2019

Я успешно обучил модель Scikit-Learn LSVC с помощью AWS SageMaker.
Я хочу сделать пакетное прогнозирование (иначе - пакетное преобразование) для относительно большого набора данных, который представляет собой скудную разреженную матрицу с формой 252772 x 185128. (Количество функций велико, потому что существует одно горячее кодирование функций пакета слов и нграмм).

Я борюсь из-за:

  • размер данных

  • формат данных

Я провел несколько экспериментов, чтобы проверить, что происходит:

1. локально прогнозировать на выборке данные разреженной матрицы

работает
десериализовать артефакт модели локально на ноутбуке SageMaker и прогнозировать на выборке разреженной матрицы.
Это было только дляубедитесь, что модель может прогнозировать данные такого типа.

2. Пакетное преобразование для образца данных CSV

Работает
Запустите задание пакетного преобразования в SageMaker и запросите преобразование небольшого образца в плотный формат CSV: он работает, но не масштабируется,очевидно.
Код:

sklearn_model = SKLearnModel(
    model_data=model_artifact_location_on_s3,
    entry_point='my_script.py',
    role=role,
    sagemaker_session=sagemaker_session)

transformer = sklearn_model.transformer(
   instance_count=1, 
   instance_type='ml.m4.xlarge', 
   max_payload=100)

transformer.transform(
   data=batch_data, 
   content_type='text/csv',
   split_type=None)   

print('Waiting for transform job: ' + transformer.latest_transform_job.job_name)
transformer.wait()

где:

  • 'my_script.py' реализует простой model_fn для десериализации артефакта модели:
def model_fn(model_dir):
    clf = joblib.load(os.path.join(model_dir, "model.joblib"))
    return clf
  • batch_data - это путь s3 для файла csv.

3. Пакетное преобразование образца плотного набора данных numpy.

Работает
Я подготовил образец данных и сохранил его в формате s3 в формате Numpy .npy. Согласно этой документации сервер модели SageMaker Scikit-learn может десериализовать данные в формате NPY (вместе с данными JSON и CSV).
Единственное отличие от предыдущего эксперимента (2) - аргумент content_type='application/x-npy' в transformer.transform(...).

Это решение не масштабируется, и мы хотели бы передать разреженную матрицу Сципи:

4. Пакетное преобразование большой разреженной матрицы.

Вот проблема
SageMaker Python SDK не поддерживает формат разреженной матрицы из коробки.
После этого:

Я использовал write_spmatrix_to_sparse_tensor для записи данныхпротобуфить формат на с3. Я использовал следующую функцию:

def write_protobuf(X_sparse, bucket, prefix, obj):
    """Write sparse matrix to protobuf format at location bucket/prefix/obj."""
    buf = io.BytesIO()
    write_spmatrix_to_sparse_tensor(file=buf, array=X_sparse, labels=None)
    buf.seek(0)
    key = '{}/{}'.format(prefix, obj)
    boto3.resource('s3').Bucket(bucket).Object(key).upload_fileobj(buf)
    return 's3://{}/{}'.format(bucket, key)

Тогда код, используемый для запуска задания пакетного преобразования:

sklearn_model = SKLearnModel(
    model_data=model_artifact_location_on_s3,
    entry_point='my_script.py',
    role=role,
    sagemaker_session=sagemaker_session)

transformer = sklearn_model.transformer(
   instance_count=1, 
   instance_type='ml.m4.xlarge', 
   max_payload=100)

transformer.transform(
   data=batch_data, 
   content_type='application/x-recordio-protobuf',
   split_type='RecordIO')   

print('Waiting for transform job: ' + transformer.latest_transform_job.job_name)
transformer.wait()

Я получаю следующую ошибку:

sagemaker_containers._errors.ClientError: Content type application/x-recordio-protobuf is not supported by this framework.

Вопросы:
(Справочный документ для Transformer: https://sagemaker.readthedocs.io/en/stable/transformer.html)

  • Если content_type='application/x-recordio-protobuf' не разрешен, что я должен использовать?
  • Является ли split_type='RecordIO' правильной настройкой в ​​этом контексте?
  • Должен ли я предоставить в своем скрипте функцию input_fn для десериализации данных?
  • Есть ли другой лучший подход для решения этой проблемы?
...