huggingface / api-inference-community

Apache License 2.0
161 stars 61 forks source link
hacktoberfest

This repositories enable third-party libraries integrated with huggingface_hub to create their own docker so that the widgets on the hub can work as the transformers one do.

The hardware to run the API will be provided by Hugging Face for now.

The docker_images/common folder is intended to be a starter point for all new libs that want to be integrated.

Adding a new container from a new lib.

  1. Copy the docker_images/common folder into your library's name docker_images/example.

  2. Edit:

    • docker_images/example/requirements.txt
    • docker_images/example/app/main.py
    • docker_images/example/app/pipelines/{task_name}.py

    to implement the desired functionality. All required code is marked with IMPLEMENT_THIS markup.

  3. Remove:

    • Any pipeline files in docker_images/example/app/pipelines/ that are not used.
    • Any tests associated with deleted pipelines in docker_images/example/tests.
    • Any imports of the pipelines you deleted from docker_images/example/app/pipelines/__init__.py
  4. Feel free to customize anything required by your lib everywhere you want. The only real requirements, are to honor the HTTP endpoints, in the same fashion as the common folder for all your supported tasks.

  5. Edit example/tests/test_api.py to add TESTABLE_MODELS.

  6. Pass the test suite pytest -sv --rootdir docker_images/example/ docker_images/example/

  7. Submit your PR and enjoy !

Going the full way

Doing the first 7 steps is good enough to get started, however in the process you can anticipate some problems corrections early on. Maintainers will help you along the way if you don't feel confident to follow those steps yourself

  1. Test your creation within a docker
./manage.py docker MY_MODEL

should work and responds on port 8000. curl -X POST -d "test" http://localhost:8000 for instance if the pipeline deals with simple text.

If it doesn't work out of the box and/or docker is slow for some reason you can test locally (using your local python environment) with :

./manage.py start MY_MODEL

  1. Test your docker uses cache properly.

When doing subsequent docker launch with the same model_id, the docker should start up very fast and not redownload the whole model file. If you see the model/repo being downloaded over and over, it means the cache is not being used correctly. You can edit the docker_images/{framework}/Dockerfile and add an environment variable (by default it assumes HUGGINGFACE_HUB_CACHE), or your code directly to put the model files in the /data folder.

  1. Add a docker test.

Edit the tests/test_dockers.py file to add a new test with your new framework in it (def test_{framework}(self): for instance). As a basic you should have 1 line per task in this test function with a real working model on the hub. Those tests are relatively slow but will check automatically that correct errors are replied by your API and that the cache works properly. To run those tests your can simply do:

RUN_DOCKER_TESTS=1 pytest -sv tests/test_dockers.py::DockerImageTests::test_{framework}

Modifying files within api-inference-community/{routes,validation,..}.py.

If you ever come across a bug within api-inference-community/ package or want to update it the development process is slightly more involved.

Another similar command ./manage.py docker --framework example --task audio-source-separation --model-id MY_MODEL Will launch the server, but this time in a protected, controlled docker environment making sure the behavior will be exactly the one in the API.

Available tasks