Преамбула
Я разработал модель нейронной сети 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():
Я более чем рад добавить любую дополнительную информацию, которая вам может понадобиться, и я очень признателен, что вы взяли время, чтобы прочитать это!