ошибка этапа выполнения aws lambda c (но работает локально)

#c #amazon-web-services #aws-lambda

#c #amazon-web-services #aws-lambda

Вопрос:

Я пытаюсь получить простой пример, работающий в среде выполнения aws c , но при вызове лямбда-функции происходит сбой seg. Для начала, пример, показанный в: https://aws.amazon.com/blogs/compute/introducing-the-c-lambda-runtime / работает нормально. Итак, теперь я извлекаю что-то из корзины следующим образом:

 #include <aws/core/Aws.h>
#include <aws/core/client/ClientConfiguration.h>
#include <aws/core/auth/AWSCredentialsProvider.h>
#include <aws/s3/S3Client.h>
#include <aws/s3/model/GetObjectRequest.h>
#include <awsdoc/s3/s3_examples.h>
#include <vector>
#include <rapidcsv.h>
#include <torch/torch.h>
#include <torch/script.h> // One-stop header.
#include <iostream>
#include <math.h>
#include <memory>
#include <aws/lambda-runtime/runtime.h>

using namespace torch::indexing;
using namespace Aws::Utils;
using namespace aws::lambda_runtime;

char const TAG[] = "LAMBDA_ALLOC";

static invocation_response my_handler(invocation_request const amp;req)
{
   if (req.payload.length() > 42)
   {
      return invocation_response::failure("error message here" /*error_message*/,
                                          "error type here" /*error_type*/);
   }

   Aws::SDKOptions options;
   Aws::InitAPI(options);

   const Aws::String bucket_name("buckname");
   const Aws::String object_name("fname");

   Aws::S3::S3Client s3_client;
   Aws::S3::Model::GetObjectRequest object_request;
   object_request.SetBucket(bucket_name);
   object_request.SetKey(object_name);
   Aws::S3::Model::GetObjectOutcome get_object_outcome =

   s3_client.GetObject(object_request);
   auto amp;retrieved_file = get_object_outcome.GetResultWithOwnership().GetBody();
   rapidcsv::Document doc(retrieved_file, rapidcsv::LabelParams(-1, -1)); /// this is where the problem is.

   const Aws::String objectKey2("model.tar");
   Aws::S3::S3Client s3_client2;
   Aws::S3::Model::GetObjectRequest object_request2;
   object_request2.SetBucket(bucket_name);
   object_request2.SetKey(objectKey2);
   Aws::S3::Model::GetObjectOutcome get_object_outcome2 =
   s3_client2.GetObject(object_request2);
   auto amp;retrieved_file2 = get_object_outcome2.GetResultWithOwnership().GetBody();

   torch::jit::script::Module module;
   module = torch::jit::load(retrieved_file2);  /// this is also where the problem is.
   std::cout << "Model Load okn";

   Aws::ShutdownAPI(options);

   return invocation_response::success(tensor_string /*payload*/,
                                       "application/json" /*MIME type*/);
}

int main()
{

   run_handler(my_handler);
   return 0;
}
 

дело в том, что он компилируется и работает должным образом, когда я запускаю его локально (debian, cmake), но когда я компилирую его для aws runtime, я получаю ошибку seg.

Я сузил проблему до двух строк:

 rapidcsv::Document doc(retrieved_file, rapidcsv::LabelParams(-1, -1)); /// this is where the problem is.
 

а также,

 module = torch::jit::load(retrieved_file2);  /// this is also where the problem is.
 

Я использую только библиотеку заголовка rapidcsv отсюда: https://github.com/d99kris/rapidcsv и, как я уже сказал, это прекрасно работает на местном уровне.

Я подозреваю, что каким-то образом среда выполнения не может найти rapidcsv (но это все еще не объясняет, почему она вызывает ошибки при module = torch::jit::load(retrieved_file2); : (

Любые указатели были бы великолепны!

Комментарии:

1. Не get_object_outcome.GetResultWithOwnership() возвращает объект RAII (поэтому уничтожается в основном немедленно), создавая auto amp;retrieved_file оборванную ссылку?

2. пример, похоже, используется GetResult() вместо этого.

3. @JaI попробует это сразу же .. но почему это работает локально?

4. @Jarod42: не могли бы вы указать мне, где getResult() используется, пожалуйста?

5. @Jarod42 да, я вижу это в документе: github.com/awslabs/aws-lambda-cpp/blob/master/examples/s3 /…

Ответ №1:

Может быть, немного поздно вводить данные сейчас, но в любом случае, если кто-то столкнется с подобными проблемами с rapidcsv на AWS Lambda:

Одним из потенциальных различий между локальным и AWS является доступная оперативная память. Следуя базовому руководству, в итоге получается лямбда-функция с 128 МБ оперативной памяти ( aws lambda create-function ... --memory-size 128 ). В зависимости от размера обрабатываемых данных это может быть на низкой стороне.

В консоли AWS Lambda можно протестировать запуск лямбда-функции и посмотреть настроенную и максимально используемую память, например:

 Resources configured   128 MB
Max memory used        44 MB
 

Возможно, стоит проверить, что максимальное использование ниже настроенного уровня.