从研究到生产
在这个系列文章中,我们的目标非常简单。我们将从一个包含原型深度学习代码的Colab笔记本开始,逐步部署和扩展它以服务数百万用户。
我们将逐步探索以下概念和想法:
- 如何构建和开发生产就绪的机器学习代码
- 如何优化模型的性能和内存需求
- 如何通过在云上设置小型服务器使其对公众可用
但这还不是全部。之后,我们需要扩展服务器以处理不断增长的用户流量。
深度学习环境设置
操作系统和终端
使用Ubuntu 20.04作为操作系统和标准Linux终端。建议安装zsh代替bash,因为它具有行完成、拼写纠正、命令历史等酷炫功能。
Git和Github
Git是一个开源版本控制系统,对于与其他开发人员在相同代码上协作至关重要。
安装和配置Git的命令:
sudo apt-get install git
git config --global user.name "AI Summer"
git config --global user.email "sergios@theaisummer.com"
设置SSH密钥以从终端提交和推送代码:
ssh-keygen -t rsa -C "your_name@github.com"
cat ~/.ssh/id_rsa.pub
Anaconda和Miniconda
为了将深度学习环境与系统其余部分隔离,虚拟环境是解决方案。Miniconda版本仅包含必要的内容。
安装命令:
wget https://repo.anaconda.com/miniconda/Miniconda2-latest-Linux-x86_64.sh
./sh Miniconda2-latest-Linux-x86_64.sh
Pycharm
Pycharm提供开箱即用的功能,如与git和conda的集成、单元测试以及云代码和bash支持等插件。
创建项目时,Pycharm会要求选择Python解释器。在此步骤中,可以选择创建新的conda环境,IDE将找到conda安装并自动创建一个。
其他工具
- Slack:与团队沟通的非常好的工具
- Zenhub:专为Github设计的项目管理工具
- Zoom:视频通话和会议
深度学习的系统设计
高级架构
假设我们有一个网站,出于某种原因想在该页面上添加图像分割功能。用户将导航到该页面,单击按钮上传图像,然后我们在执行分割后显示结果。
在软件方面,流程是这样的:用户将图像上传到浏览器,浏览器将图像发送到我们的后端,UNet预测分割后的图像,我们将图像发送回用户的浏览器,在那里进行渲染。
软件设计原则
每个系统都应基于一些基本原则构建:
- 关注点分离:系统应模块化为不同的组件,每个组件都是独立可维护、可重用和可扩展的实体
- 可扩展性:系统需要能够随着流量增加而扩展
- 可靠性:即使出现软件或硬件故障,系统也应继续运行
- 可用性:系统需要始终继续运行
- 简单性:系统必须尽可能简单直观
系统组件
- 负载均衡器:处理流量并将请求路由到适当的服务器实例
- 模型实例:维护多个模型实例以实现可扩展性和可用性
- 数据库:保存请求、响应和所有相关数据
- 消息队列:以异步方式将它们发送到数据库
- 数据作业:预处理数据并将其转换为正确格式
- 重新训练实例:基于保存的数据执行实际训练
- 监控和日志记录:全面了解系统中发生的情况
准备软件工程
在本文中,我给了你两个主要任务在等待下一篇文章时完成:
- 设置笔记本电脑并安装在整个课程中需要的工具
- 理解现代深度学习系统的原因
第一个是低努力、有点无聊的工作,将提高你的生产力并在以后节省一些时间,这样我们可以只关注软件。第二个需要一些脑力劳动,因为深度学习架构是相当复杂的系统。
# 示例代码:UNet模型定义
base_model = tf.keras.applications.MobileNetV2(input_shape=[128, 128, 3], include_top=False)
layer_names = [
'block_1_expand_relu', # 64x64
'block_3_expand_relu', # 32x32
'block_6_expand_relu', # 16x16
'block_13_expand_relu', # 8x8
'block_16_project', # 4x4
]
layers = [base_model.get_layer(name).output for name in layer_names]
down_stack = tf.keras.Model(inputs=base_model.input, outputs=layers)
down_stack.trainable = False
up_stack = [
pix2pix.upsample(512, 3), # 4x4 -> 8x8
pix2pix.upsample(256, 3), # 8x8 -> 16x16
pix2pix.upsample(128, 3), # 16x16 -> 32x32
pix2pix.upsample(64, 3), # 32x32 -> 64x64
]
def unet_model(output_channels):
inputs = tf.keras.layers.Input(shape=[128, 128, 3])
x = inputs
# 通过模型下采样
skips = down_stack(x)
x = skips[-1]
skips = reversed(skips[:-1])
# 上采样并建立跳跃连接
for up, skip in zip(up_stack, skips):
x = up(x)
concat = tf.keras.layers.Concatenate()
x = concat([x, skip])
# 这是模型的最后一层
last = tf.keras.layers.Conv2DTranspose(
output_channels, 3, strides=2,
padding='same') # 64x64 -> 128x128
x = last(x)
return tf.keras.Model(inputs=inputs, outputs=x)
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)或者 我的个人博客 https://blog.qife122.com/
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
4936

被折叠的 条评论
为什么被折叠?



