(二)为AI和机器学习创建Docker容器

2023-05-16

目录

介绍

基本镜像

创建Dockerfile

构建镜像

运行容器

总结


  • 下载源文件 - 154.4 KB

介绍

Docker等容器技术显着简化了软件的依赖管理和可移植性。在本系列文章中,我们探讨了Docker在机器学习(ML)场景中的使用。

本系列假设您熟悉ML、一般容器化,尤其是Docker。欢迎您下载项目代码

在本系列的上一篇文章中,我们已经讨论了Docker基础知识。在本文中,我们将开始应用这些知识,同时在各种ML场景中创建和运行容器。首先,我们将创建一个用于实验和训练的通用容器。

基本镜像

在考虑镜像大小和安全性时,Alpine Linux似乎是基本镜像的明显选择。但是对于Python应用程序,它并不是那么简单。Alpine使用musl——一个不同于大多数标准Linux发行版使用的glibC库。这使得大多数编译的Pip轮子不兼容,因此在安装过程中需要编译。实际上,在Alpine上设置任何重要的Python环境(具有多级依赖项)比在更流行的发行版(如DebianUbuntu)上花费的时间要多得多。不仅如此,结果镜像可能更大,代码可能运行得更慢!

有关更多详细信息,请查看这篇文章。为避免上述问题,我们将选择构建在Debian 10(Buster)之上的官方Python镜像的最小版本作为基础:python:3.8.8-slim-buster

创建Dockerfile

我们需要一个带有基本ML库和Jupyter Notebook的镜像来处理实验。我们将所有需要的库存储在app/requirements.txt文件中:

numpy==1.19.5
pandas==1.2.2
scikit-learn==0.24.1
matplotlib==3.3.4
jupyter==1.0.0
opencv-python==4.5.1.48
tensorflow-cpu==2.4.0

现在,让我们开始创建我们的Dockerfile

FROM python:3.8.8-slim-buster
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get -y install --no-install-recommends ffmpeg libsm6 libxext6 \
&& apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/*

首先,切换到非交互模式后,我们安装Python库所需的所有系统依赖项,然后清理以限制镜像大小。请注意,如果您更改requirements.txt,这些依赖项可能会有所不同。

接下来,我们在运行容器时使用非root用户:

ARG USERNAME=mluser
ARG USERID=1000
RUN useradd --system --create-home --shell /bin/bash --uid $USERID $USERNAME

如果需要,使用USERNAMEUSERID值的参数可以让我们在构建和执行期间替换它们。

然后,让我们配置一个Python 环境:

COPY app/requirements.txt /tmp/requirements.txt
RUN pip3 install --no-cache-dir -r /tmp/requirements.txt \
&& rm /tmp/requirements.txt

最后,如果没有指定其他命令,我们切换到新用户并默认启动一个Jupyter Notebook

USER $USERNAME
WORKDIR /home/$USERNAME/app
EXPOSE 9000
CMD ["jupyter", "notebook", "--ip", "0.0.0.0", "--port", "9000"]

构建镜像

Linux上,我们应该始终使用预先确定的用户来运行容器。这确保容器的内部进程以及保存到映射主机驱动器的文件将具有预期的所有者。在以下示例中,我们确保当前用户对构建image mld02_cpu_experiment时创建的所有文件具有适当的权限:

$ docker build --build-arg USERID=$(id -u) -t mld02_cpu_experiment .

提供的--build-arg USERID参数将使用提供的值替换Dockerfile的预定义USERID参数。

实际上,只有在Linux上本地运行容器时才需要这样做。镜像的默认值(1000)可能会导致主机出现问题,并且容器需要对镜像中包含的用户文件夹或文件的写入权限。在任何其他情况下,您可以跳过此步骤。

运行容器

容器搭建好后,我们就可以试一试了。假设我们已经下载并提取了示例代码,我们运行我们的Jupyter Notebook实例:

$ docker run -p 9000:9000 -v $(pwd)/app:/home/mluser/app -v $(pwd)/data:/home/mluser/data --rm --user $(id -u):$(id -g) mld02_cpu_experiment

Windows上:

$ docker run -p 9000:9000 -v %cd%/app:/home/mluser/app -v %cd%/data:/home/mluser/data --rm mld02_cpu_experiment

这里的参数是:-p将容器端口映射到主机端口,-v将主机的应用程序和数据文件夹映射到容器文件夹(绝对路径),并且--user确保我们在当前主机用户的上下文中执行容器代码(以获得一个映射文件夹中文件的正确所有者)。该--rm标志可确保在容器停止后立即自动删除所有容器数据。

如果一切顺利,我们应该会看到Jupyter Notebook的日志在旋转:

多亏了映射的端口,我们应该能够使用http://localhost:9000(或上述日志中的 URL)在 Web 浏览器中打开笔记本。

简单的Training.ipynb包含我们使用简单的TensorFlow模型训练示例MNIST模型所需的一切。执行完所有单元后,我们应该期待以下确认模型的预测是正确的:

我们将在后续文章中使用此notebook保存的训练模型进行推理。

总结

在本文中,我们创建了一个用于实验的基本容器。在下一篇文章中​​​​​​​,我们将创建一个容器来在训练后的模型上运行CPU推理。

https://www.codeproject.com/Articles/5300725/Creating-Docker-Containers-for-AI-and-Machine-Lear

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(二)为AI和机器学习创建Docker容器 的相关文章

随机推荐

  • Unresolved reference: viewModels,viewModels()方法找不到

    遇到的问题 最近在学习LiveData和ViewModel xff0c 跟着官网敲 xff0c 碰到了以下情况 span class token keyword private span span class token keyword v
  • 天干地支计算

    年的干支 方法一 xff1a 首先要能记住十大天干和十二地支 xff0c 十天干 xff1a 甲 乙 丙 丁 戊 己 庚 辛 壬 癸 xff1b 十二地支 xff1a 子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥 xff1b 天干地支纪年
  • 程序员们,AI来了,机会来了,危机也来了

    程序员们 xff0c AI来了 xff0c 机会来了 xff0c 危机也来了 1 人工智能真的来了 纵观古今 xff0c 很少有计算机技术能有较长的发展寿命 xff0c 大部分昙花一现 xff0c 比如 xff1a 昔日的DOS windo
  • 统信UOS 20 1050 记录一次openssl升级失败的排查过程

    目录 不能找到openssl最新版本的原因 fedora有相关module的介绍 一些yum module 常用的命令 xff1a 查看yum module 都有哪些 启用禁用module 总结 xff1a 后记 xff1a 通过yum l
  • iOS之富文本

    之前做项目时遇到一个问题 xff1a 使用UITextView显示一段电影的简介 xff0c 由于字数比较多 xff0c 所以字体设置的很小 xff0c 行间距和段间距也很小 xff0c 一大段文字挤在一起看起来很别扭 xff0c 想要把行
  • JetBrains IntelliJ IDEA 2022.2 使用 Java 17 运行时

    JetBrains 发布 了 IntelliJ IDEA 2022 2 xff0c 支持 Java 17 和最新的语言和框架 xff0c 如 Scala Kotlin Spring 6 和 Spring Boot 3 这个新版本使用了 Je
  • Linux生产者消费者模型实现

    转载请注明出处 xff1a https blog csdn net mymottoissh article details 84181224 任何语言提及到多线程同步都离不开生产者 消费者模型 这也是针对许多现实问题建模用到的基础模型 这一
  • 使用CMD启动JAR后,出现定时器不执行问题

    SpringBoot项目中 使用了 64 Scheduled注解开启一个定时任务 在windows系统启动时 开始输出正常 当执行到输出控制台日志时 有时候会直接卡住线程不执行了 查了一圈发现是CMD的快速编辑引起的线程阻塞 解决办法 1
  • Flink开发中遇到的问题及解法

    1 当Source是Kafka的时候 xff0c 如何设置Source Operator的并发度 xff1f 如果没有指定 xff0c Source Operator的个数与集群中的TaskManager的个数相等 如果手动设置 xff0c
  • vue初学者代码格式报错

    报错内容 xff1a Do not use built in or reserved HTML elements as component id header
  • Ubuntu 设置su密码

    在使用su命令获取超级权限的时候提示输入密码 xff0c 在安装ubuntu的时候只设置了用户密码 xff0c 没记得有其他密码 这里需要给root用户重新设置密码 xff1a sudo passwd 然后输入密码即可
  • Spark MLlib学习(二)——分类和回归

    MLlib支持多种分类方法 xff0c 如二分类 多分类和回归分析等 问题类型 支持的方法 二分类 线性SVM 逻辑回归 xff0c 决策树 xff0c 随机森林 xff0c GBDT xff0c 朴素贝叶斯 多分类 决策树 xff0c 随
  • 关于onNewIntent你应该知道的

    一 API描述如下 大概意思是当Activity被设以singleTop模式启动 xff0c 当需要再次响应此Activity启动需求时 xff0c 会复用栈顶的已有Activity xff0c 还会调用onNewIntent方法 并且 x
  • 程序猿的情话

    世界上最遥远的距离 xff0c 是我在if里你在else里 xff0c 似乎一直相伴又永远分离 xff1b 世界上最痴心的等待 xff0c 是我当case你是switch xff0c 或许永远都选不上自己 xff1b 世界上最真情的相依 x
  • SpringBoot JPA实践之EntityManage查询返回自定义DTO

    在很多时候我更喜欢随意组合查询出来返回一个DTO对象的实现 xff0c JPA提供的多数查询均以返回Entity居多 xff0c 它提供的EntityManager对象可以实现将SQL语句查询的结果转换为自定义DTO对象 xff08 这与
  • 经典编程书籍(C++, 网络, Windows, Linux)【转载】

    书单中列举的都是相关领域的经典书籍 xff0c 必读之作 此书单的编辑参考了很多网站 xff0c 包括一些名家的推荐 xff0c 例如侯捷 xff0c 孟岩 xff0c 荣耀 xff0c 潘爱民等等 xff0c 在此也向这些前辈表示感谢 1
  • SpringBoot微服务框架概述

    SpringBoot微服务框架 2 Spring Boot 微服务框架的特点3 Spring Boot 应用场景4 SpringBoot的第一个应用5 Springboot引导类的main方法有什么作用 xff1f 6 SpringBoot
  • 使用Spring的注解方式实现AOP

    Spring对AOP的实现提供了很好的支持 下面我们就使用Spring的注解来完成AOP做一个例子 首先 xff0c 为了使用Spring的AOP注解功能 xff0c 必须导入如下几个包 aspectjrt jar aspectjweave
  • 如何正确有效的学习一门计算机语言?

    在这个互联网高速发展的社会 xff0c 越来越多的人喜欢上了IT行业 xff0c 认为计算机行业是一个高科技的 高薪的行业 的确如此 xff0c 但是系统的学习一门计算机语言 xff0c 并且把它用运用到真正的开发中去还真不是一件简单的事情
  • (二)为AI和机器学习创建Docker容器

    目录 介绍 基本镜像 创建Dockerfile 构建镜像 运行容器 总结 下载源文件 154 4 KB 介绍 Docker 等容器技术显着简化了软件的依赖管理和可移植性 在本系列文章中 xff0c 我们探讨了 Docker 在机器学习 ML