AWS Требования к пользовательскому контейнеру Sagemaker - PullRequest
0 голосов
/ 30 января 2020

Преамбула

Я разработал модель нейронной сети Pytorch для прогнозирования, являются ли два цвета дополнительными. Чтобы сделать его более общедоступным, я начал изучать хостинг на AWS.

Сначала я надеялся, что смогу разместить что-то простое, загрузив файл .PT модели горелки в E3 и сделав конечные точки в AWS лямбда-выражениях, которые загружают эту модель и делают прогноз, но я быстро обнаружил, что это было бы невозможно. Итак, я посмотрел на AWS Sagemaker. После небольшой игры я смог загрузить свою модель факела и делать прогнозы в ноутбуках Sagemaker, однако я не смог развернуть ноутбук, чтобы позволить конечным точкам получать к нему доступ независимо от того, что я пытался.

В конце концов я нашел это полезное руководство по разработке собственной модели ML для docker на основе Sagemaker. Я в основном следовал учебному пособию, но изменил его для своих собственных целей (например, с помощью базового контейнера Pytorch docker, с использованием моей собственной конфигурации модели et c. Et c.).

Проблема

Моя модель тренируется правильно, и я могу запустить изображение docker для обслуживания модели. Когда я отправляю ping на изображение docker, я получаю здоровый ответ, и этот ответ я получаю на стороне сервера:

2020-01-30 02:58:09,711 [INFO ] pool-1-thread-7 ACCESS_LOG - /IP:STUFF "GET /ping HTTP/1.1" 200

И все же, когда я пытаюсь сделать прогноз, используя эта команда

command:

    ./predict.sh localhost:8080 example.csv text/csv

./predict.sh:

    #!/bin/bash

    url=$1
    payload=$2
    content=${3:-text/csv}

    curl --data-binary @${payload} -H "Content-Type: ${content}" -v ${url}/invocations

Зависает вызов curl, и на стороне сервера я продолжаю сталкиваться с этим сообщением об ошибке:

2020-01-30 03:06:41,652 [INFO ] W-9001-model com.amazonaws.ml.mms.wlm.WorkerThread - Backend response time: 2
2020-01-30 03:06:41,652 [WARN ] W-9001-model com.amazonaws.ml.mms.wlm.WorkerThread - Backend worker thread exception.
java.lang.IllegalArgumentException: reasonPhrase contains one of the following prohibited characters: \r\n:
Please provide a model_fn implementation.
See documentation for model_fn at https://github.com/aws/sagemaker-python-sdk

    at io.netty.handler.codec.http.HttpResponseStatus.<init>(HttpResponseStatus.java:555)
    at io.netty.handler.codec.http.HttpResponseStatus.<init>(HttpResponseStatus.java:537)
    at io.netty.handler.codec.http.HttpResponseStatus.valueOf(HttpResponseStatus.java:465)
    at com.amazonaws.ml.mms.wlm.Job.response(Job.java:85)
    at com.amazonaws.ml.mms.wlm.BatchAggregator.sendResponse(BatchAggregator.java:85)
    at com.amazonaws.ml.mms.wlm.WorkerThread.run(WorkerThread.java:146)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
2020-01-30 03:06:41,654 [ERROR] W-9001-model com.amazonaws.ml.mms.wlm.BatchAggregator - Unexpected job: PRIVATE_JOB_ID
2020-01-30 03:06:41,656 [INFO ] W-9001-model com.amazonaws.ml.mms.wlm.WorkerThread - Retry worker: 9001 in 1 seconds.
2020-01-30 03:06:41,667 [INFO ] epollEventLoopGroup-4-5 com.amazonaws.ml.mms.wlm.WorkerThread - 9001 Worker disconnected. WORKER_STOPPED
2020-01-30 03:06:42,761 [INFO ] W-9001-model-stdout com.amazonaws.ml.mms.wlm.WorkerLifeCycle - Listening on port: /home/model-server/tmp/.mms.sock.9001
2020-01-30 03:06:42,762 [INFO ] W-9001-model-stdout com.amazonaws.ml.mms.wlm.WorkerLifeCycle - [PID]126
2020-01-30 03:06:42,762 [INFO ] W-9001-model-stdout com.amazonaws.ml.mms.wlm.WorkerLifeCycle - MXNet worker started.
2020-01-30 03:06:42,762 [INFO ] W-9001-model-stdout com.amazonaws.ml.mms.wlm.WorkerLifeCycle - Python runtime: 3.6.6
2020-01-30 03:06:42,762 [INFO ] W-9001-model com.amazonaws.ml.mms.wlm.WorkerThread - Connecting to: /home/model-server/tmp/.mms.sock.9001
2020-01-30 03:06:42,766 [INFO ] W-9001-model-stdout com.amazonaws.ml.mms.wlm.WorkerLifeCycle - Connection accepted: /home/model-server/tmp/.mms.sock.9001.
2020-01-30 03:06:43,060 [INFO ] W-9001-model com.amazonaws.ml.mms.wlm.WorkerThread - Backend response time: 293

Я прочитал документацию, которая указана в этой ошибке печати и кажется, что проблема заключается в том, что у меня нет model_fn реализации. Я прочитал аналогичную проблему, возникшую у кого-то здесь , и попытался использовать их решение для решения проблемы (то есть я реализовал model_fn, input_fn, output_fn и predict_fn в моем файле поезда) но он все еще не работает.

Для справки

Чтобы посмотреть, как выглядит мой train файл в opt/program Я приложил код файла минус фактическая обучающая часть. Как вы можете видеть, большая часть кода является кодом по умолчанию, поэтому я не уверен, что происходит не так.

def model_fn(model_dir):
    model = NeuralNet.NeuralNet()
    with open(os.path.join(model_dir, 'model.pt'), 'rb') as f:
        # model.load_state_dict(torch.load(f))
        model = torch.load(f)
    return model


def predict_fn(input_data, model):
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    model.to(device)
    model.eval()
    with torch.no_grad():
        return model(input_data.to(device))


def input_fn(request_body, request_content_type):
    if request_content_type == 'application/python-pickle':
        return torch.load(BytesIO(request_body))
    else:
        if request_content_type == 'text/csv':
            return pd.read_csv(BytesIO(request_body), header=None, sep=",")


def output_fn(prediction, content_type):
    return json.dumps(prediction)


def train():

Я более чем рад добавить любую дополнительную информацию, которая вам может понадобиться, и я очень признателен, что вы взяли время, чтобы прочитать это!

...