web-dev-qa-db-fra.com

La bibliothèque XGBoost (libxgboost.so) n'a pas pu être chargée

Problème

Dans un projet sans serveur, je souhaite importer XGBoost dans un lambda écrit sur Python. Mais lorsque j'essaye d'appeler le lambda, je vois cette erreur sur CloudWatch:

[ERREUR] XGBoostError: la bibliothèque XGBoost (libxgboost.so) n'a pas pu être chargée.
Causes probables:
* Le moteur d'exécution OpenMP n'est pas installé (vcomp140.dll ou libgomp-1.dll pour Windows, libgomp.so pour les systèmes d'exploitation de type UNIX)
* Vous exécutez 32 bits Python sur un système d'exploitation 64 bits
Message (s) d'erreur: ['libgomp.so.1: impossible d'ouvrir le fichier objet partagé: aucun fichier ou répertoire de ce type']

Qu'est-ce que j'ai essayé?

  1. Je suis entrain de courir sls deploy sur macOS, j'ai donc ajouté dockerizePip: true sur mon serverless.yml

  2. J'ai essayé de corriger la dépendance manquante en utilisant un Dockerfile personnalisé:

    FROM lambci/lambda:build-python3.6
    
    RUN apt-get update && apt-get install libaio1
    

    Je dois également spécifier le chemin de la bibliothèque dans dockerExtraFiles mais je n'ai aucune idée de l'emplacement de libgomp.so sous Linux. Donc, je suis resté sur ce point.

Mon code

serverless.yml:

app: improve
org: kvadrug
service: testservice

provider:
  name: aws
  runtime: python3.8
  versionFunctions: false
  stage: dev
  region: us-west-2
  timeout: 30

plugins:
  - serverless-python-requirements

custom:
  pythonRequirements:
    dockerFile: Dockerfile
    Zip: true
    dockerizePip: true

functions:
  hello:
    handler: hello.hello
    events:
      - http:
          path: hello
          method: post
          private: true

package.json:

{
    "name": "testservice",
    "version": "1.0.0",
    "description": "Test service",
    "dependencies": {},
    "devDependencies": {
        "serverless-python-requirements": "^5.1.0"
    }
}

requirements.txt:

xgboost==1.0.2
3
kelin

Sous Linux, les bibliothèques dont vous avez besoin sont installées

/usr/lib/x86_64-linux-gnu/libgomp.so.1
/usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0

par

apt-get install libgomp1

Sur les nouveaux Ubuntu et CentOS, libgomp1 n'est plus installé par défaut (je viens de vérifier - je l'ai sur xenial, ne l'ai pas sur un frais bionique).

Ceci est sur une machine AWS, malheureusement pas très récente (je n'en ai pas d'autre facilement disponible):

lrwxrwxrwx 1 root root     16 Oct  4  2019 /usr/lib/x86_64-linux-gnu/libgomp.so.1 -> libgomp.so.1.0.0
-rw-r--r-- 1 root root 138448 Oct  4  2019 /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0
0
LSerni