4

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
  • What is the specific error you are getting? – MrFlick Feb 06 '23 at 21:43
  • Well, I ran a new container and I get `*** caught segfault *** address (nil), cause 'unknown'` – Alex Yahiaoui Martinez Feb 07 '23 at 07:26
  • can reproduce this error and sometimes i get another C related Segfault. Memory allocation in virtual envs and containers can get tricky, maybe try to reduce the level of abstraction (ie using python directly in docker) – user12256545 Feb 07 '23 at 13:42
  • The idea is to embed the TPOT autoML in a Rscript. I tried `reticulate::source_python()` but I got a similar result. However, the library works well using native python like in the example listed in the description. – Alex Yahiaoui Martinez Feb 07 '23 at 15:49
  • on my machine TPOT works also fine using reticulate but not from docker – user12256545 Feb 07 '23 at 16:48

1 Answers1

3

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"
Arthur
  • 1,248
  • 8
  • 14