rdockerdockerfiletpot

Integrating TPOT autoML library in Docker container from rocker/r-ver:X.X.X


I would like to embed the TPOT autoML library in a Docker container from rocker/r-ver:4.1.0. To make dream come true, I used the R package reticulate. I was inspired by this project to build the Dockerfile. However, it doesn't work in R environment.

In my opinion, some debian dependencies are missing. I added libstdc++6 or gcc but it doesn't work too. Anybody have an idea? Many thanks.

main.R

X_train <- iris[,-5]
y_train <- iris$Species

tpot <- reticulate::import("tpot")
tp <- tpot$TPOTClassifier(generations = 1)
fit <- tp$fit(X_train, y_train)

score <- fit$predict(X_train)
print(score)

Dockerfile

FROM rocker/r-ver:4.1.0

RUN R -q -e 'install.packages("remotes")'
RUN R -q -e 'remotes::install_github("rstudio/reticulate", upgrade = "never")'
RUN R -q -e 'reticulate::install_miniconda()'
RUN R -q -e 'reticulate::conda_install("r-reticulate", c("python=3.8.13", "numpy<1.24"))'
RUN R -q -e 'reticulate::conda_install("r-reticulate", "tpot", pip = TRUE)'

COPY main.R main.R

CMD ["Rscript", "main.R"]

Build and Run the Docker image:

sudo docker build --no-cache -t tpot-demo .
sudo docker run tpot-demo

Solution

  • This Dockerfile works for me. You?

    FROM rocker/tidyverse
    
    WORKDIR /tpot_test
    
    RUN apt-get -y update
    RUN apt-get -y upgrade
    RUN apt-get -y install git
    
    RUN R -e "install.packages('reticulate')"
    RUN R -e "reticulate::install_python()"
    RUN R -e "reticulate::install_miniconda()"
    
    RUN R -q -e 'install.packages("remotes")'
    RUN R -q -e 'reticulate::conda_install("r-reticulate", c("python=3.8.13", "numpy<1.24"))'
    RUN R -q -e 'reticulate::conda_install("r-reticulate", "tpot", pip = TRUE)'
    
    COPY main.R main.R
    
    CMD ["Rscript", "main.R"]
    

    I don't know what change did the trick. Perhaps using the rocker/tidyverse image so that devtools gets installed?

    I've always set a WORKDIR and I notice you didn't. Perhaps that?

    A general piece of advice is that docker exec is a great tool for debugging Dockerfiles. You can start from a base image (i.e. rocker/tidyverse), docker exec into it, test commands one by one until you can get the whole sequence to work, and then code this sequence to the Dockerfile.

    Here is the output:

    /root/.local/share/r-miniconda/envs/r-reticulate/lib/python3.8/site-packages/tpot/builtins/__init__.py:36: UserWarning: Warning: optional dependency `torch` is not available. - skipping import of NN models.
      warnings.warn("Warning: optional dependency `torch` is not available. - skipping import of NN models.")
      [1] "setosa"     "setosa"     "setosa"     "setosa"     "setosa"
      [6] "setosa"     "setosa"     "setosa"     "setosa"     "setosa"
     [11] "setosa"     "setosa"     "setosa"     "setosa"     "setosa"
     [16] "setosa"     "setosa"     "setosa"     "setosa"     "setosa"
     [21] "setosa"     "setosa"     "setosa"     "setosa"     "setosa"
     [26] "setosa"     "setosa"     "setosa"     "setosa"     "setosa"
     [31] "setosa"     "setosa"     "setosa"     "setosa"     "setosa"
     [36] "setosa"     "setosa"     "setosa"     "setosa"     "setosa"
     [41] "setosa"     "setosa"     "setosa"     "setosa"     "setosa"
     [46] "setosa"     "setosa"     "setosa"     "setosa"     "setosa"
     [51] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
     [56] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
     [61] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
     [66] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
     [71] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
     [76] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
     [81] "versicolor" "versicolor" "versicolor" "virginica"  "versicolor"
     [86] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
     [91] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
     [96] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
    [101] "virginica"  "virginica"  "virginica"  "virginica"  "virginica"
    [106] "virginica"  "virginica"  "virginica"  "virginica"  "virginica"
    [111] "virginica"  "virginica"  "virginica"  "virginica"  "virginica"
    [116] "virginica"  "virginica"  "virginica"  "virginica"  "virginica"
    [121] "virginica"  "virginica"  "virginica"  "virginica"  "virginica"
    [126] "virginica"  "virginica"  "virginica"  "virginica"  "virginica"
    [131] "virginica"  "virginica"  "virginica"  "versicolor" "virginica"
    [136] "virginica"  "virginica"  "virginica"  "virginica"  "virginica"
    [141] "virginica"  "virginica"  "virginica"  "virginica"  "virginica"
    [146] "virginica"  "virginica"  "virginica"  "virginica"  "virginica"