大家好,下午好。我是来自 RunPod Flash 的 Dean Kinyanola。我想和大家谈谈如何在不使用 Docker 的情况下部署 AI 应用。目前,无服务器应用的部署流程通常是这样的:编写代码、构建 Dockerfile、运行一系列命令如 docker build,然后将镜像推送到 Docker Hub。接着执行它,也许能得到想要的结果;如果不行,就得修改代码、重新构建、再次推送并执行。根据我的经验,这个循环有时需要大约 15 分钟,具体取决于所做的更改。

我是 Dean Kinyanola,在 RunPod 担任高级工程师,我带领着一个团队致力于简化这一过程。那么我们为什么构建 Flash?因为开发迭代循环需要改进,这确实很麻烦。在座的很多是软件工程师或机器学习工程师,你们真的不想处理所有的 DevOps 工作。因此,当你在构思想法或进行实验时,你需要的是结果。不再需要 Docker 了,像本地运行代码一样操作,仿佛你拥有 GPU。即时测试更改并在需要时快速调试。

我们秉持保持简单的理念:编写代码,执行,获取结果;重写代码,再次执行,获取结果。当然还有部署部分,我稍后会谈到。整个过程如此简单,感觉就像在本地运行一样。那么它有哪些功能呢?我们能够更快构建和部署;优化资源利用率,幕后有很多技巧在起作用。它非常直观,只是 Python 代码。基本上,任何能在本地 GPU 上运行的东西,都可以在云端运行。

今天 Flash 能做什么?我们有无服务器端点(Serverless Endpoints),目前主要锁定在无服务器上,但我们正致力于将其扩展到 Pod。我们提供 Q 端点和负载均衡端点供你使用。这里有一个非常酷的功能,即端点到端的通信。有时你在构建所有这些服务器,但你仍然需要知道如何联系每个服务器,对吧?使用这个功能你就不必这样做,因为只是代码与另一段代码对话。执行一个函数看起来就像在本地操作一样,但一旦部署到不同的端点,它们都在互相通信。

这一切都发生在幕后。我们还有网络卷挂载功能。在网络卷挂载中我们有预热缓存,这样如果你需要扩展无服务器端点,这些缓存会通过网络卷保留下来。最重要的是实时无服务器功能(Live Serverless)。你可以像代码都在本地系统运行一样进行编码和测试。如果你无法部署到生产环境,这只是一个玩具项目,对吧?所以你需要部署到生产环境。

我们要提供推理服务,为你构建的所有内容提供服务。我们通过命令行界面(CLI)使这一切成为可能。让我们进行演示,希望我能单手完成。好的,我的演示展示了函数的快速迭代和演变。第一个函数只是与 Torch 交互以获取你拥有的 GPU 类型信息。我将现场演示,运行 flash dev。这会启动一个 FastAPI localhost,你可以实际尝试一下。

现在你想试试吗?让我们执行看看。它正在配置这个无服务器端点。如果我们转到 RunPod 控制台并刷新,你会看到它在运行中。在它加载时,让我们展示日志以便你查看。好的,工作节点已就绪。是的。哦,冷启动。这是所有无服务器平台常见的现象。啊,它启动了。它在运行中,我们看到了日志和容器日志。

所以它在测试所有这些内容以确保一切健康,并运行了任务。现在如果我们回到这里,你会看到结果。它在 Nvidia GeForce RTX 4090 上运行了。你可以看到所有 RAM、GPU 数量等细节。现在,关键来了:如果我想更改这个函数并只想测试一下该怎么办?这是该函数的另一个迭代版本。我们做的是添加更多代码,这段代码实际上只是进行文本生成。

我还添加了一些依赖项,即 Python 依赖项。哦,实际上让我们先不使用 Hugging Face token 试试,看看会发生什么。看,它刷新了所有内容。我刷新了这个页面再次测试。我们需要什么样的提示词?嗯,让我们试试“string cheese”(奶酪条)。它是真的吗?运行它。你在这里再次看到容器启动。好的,它正在加载。你会看到这里的所有日志都更简洁了,因为你不需要被大量信息淹没。

但它正在做的是即时安装依赖项,并且即使没有 token 与 Hugging Face 服务器通信时它也给了我一个警告。它应该快完成了。好的,现在完成了。让我们看看结果。我问“奶酪条是真的吗?”很抱歉,我无法提供答案。好吧,这很有趣。好的,让我们改变一下设置。启用我的 HF token。这只是现在更改代码。我们再次发布它。

让我们改变提示词,看看“谁是蝙蝠侠”。执行那个命令。准备好了吗?让我们看看这里是如何工作的。很酷,我正用一只手做这个。好的,让我们完成它。现在我们看到了结果。哦,在那里。蝙蝠侠是一个虚构角色。好吧,我们早就知道了。让我们尝试比单纯生成文本更复杂的内容。现在我们将进行图像生成。好的,它刷新了。让我们刷新这个 localhost。

现在你看到“generate image”(生成图像),然后我们将用提示词测试它:创建一张奶酪条蝙蝠侠的图片。好吧,这就是 AI 的创造力所在。让我们看看这里发生了什么:运行日志。哦,看那个。正在部署中。好的,我还有很多时间。那不是它。好吧,我只是不得不终止它,因为它在运行旧版本。好的,现在是新的了。我不想等待那个部署过程,我只想看看奶酪条蝙蝠侠是什么样子的。

所以它返回了一个 base64 编码的结果。好的,让我在展示之前清理一下这些数据。你可以通过浏览器渲染它。好吧,让我们看看奶酪条蝙蝠侠长什么样。那不是奶酪条,但这证明了它是有效的。它确实做到了。那么如果你想部署这个该怎么办?看看这里:当我取消时,它实际上撤销了该端点的配置。所以你不需要让它闲置在那里。看,现在它消失了。

那么如果我们想部署这个呢?让我们部署那个:flash deploy。它将打包

整个流程会自动构建并发送到我们的服务器。再次强调,这里不需要 Docker,你完全不用处理 Docker 相关的事务。这是对你应用程序的即时打包、发送至我们的服务器并进行服务部署。现在,精彩的部分来了。一旦应用上线,我已经准备好了这个提示词(prompt),稍后我只需要更改一下 ID 即可,因为那个 ID 很重要。好的,所以它创建了名为“built flash”的归档文件。好了,正在发送出去……已上传。正在部署中。现在它已经上线了。好的,让我们看看这里的 ID 是多少……好了,现在开始运行吧。我的提示词是“一只戴着领结的可爱海獭宝宝”,请生成这张图片。哦,是的!我想向你展示一下它的位置。现在这个应用已经完全可服务了,对吧?你可以让你的客户使用基于此后端的应用程序。它不再驻留在我的本地主机上,而是由服务器托管。好的,让我们看看工作节点的日志。当它完成时,应该会在这里打印输出结果……好了,让我把这个窗口折叠一下以便查看。

单手操作确实有点疯狂。好的,让我们加载那只戴着领结的海獭图片……咦?好像没有看到领结。但这并不是重点,对吧?这就是演示效果。昨天我们举办了一场黑客松(Hackathon)活动,我特意想在这里展示一下,我要特别表扬一位叫 Funka 的开发者。他围绕我们的 Flash 技术创建了一个封装工具,允许你上传包含所有实验数据、模型规格等信息的数据表,并即时运行。它会自动分发任务、构建所有的端点(endpoints)、执行你的训练过程,然后向你汇报结果。他仅仅用了三到四个小时就完成了这项工作。起初他甚至不知道 RunPod Flash 是什么,还不得不问我这是否可行。我说:“让我们试试看。”昨天他获胜时非常惊讶,因为据说那甚至不是他的最佳项目,而且他在之前的黑客松比赛中一直输给其他人。所以我真的为他感到骄傲。

那么,如何开始使用 RunPod Flash 呢?首先,你需要在 RunPod 上注册一个账户,扫描那个二维码,即可获得一些十美元的信用额度。你真正需要做的只是安装软件、编写代码、登录并填入你的 API 密钥,然后进行初始化。系统会提供一个骨架应用程序供你参考(如果你需要的话)。接着使用“flash”命令来部署本地开发环境,或者使用“flash deploy”将其部署到生产环境。我们还提供了所有这些 URL 链接。我给出的最佳建议是访问 GitHub 上的 RunPod Flash 示例仓库,那里有各种案例和示例供你参考。如果你喜欢 AI 编程,可以直接让 Cloud Code 进入该仓库学习所有内容。我们还提供了技能模块(skills),如果你对此感兴趣的话。这就是我的演示内容。