趋近智
使用pickle或joblib保存训练好的机器学习 (machine learning)模型是其部署过程中的一个重要初始步骤。然而,这一步仅仅是确保模型顺利部署的一部分。假设您已经仔细保存了模型文件,比如model.joblib。现在,您将这个文件移到另一台电脑(或服务器)上进行预测。当您尝试使用joblib.load('model.joblib')加载它时,您可能会遇到意料之外的错误,甚至更糟糕的是,预测结果出现细微偏差。这个问题出现的原因是,您加载模型的环境可能与您保存模型的环境不同。因此,处理这些差异(即模型依赖)变得不可或缺。
在部署机器学习 (machine learning)模型的情境下,依赖是指您的模型和预测代码正常运行所需的所有外部软件组成部分。这些通常包括:
scikit-learn(用于模型本身和通常的预处理)numpy(用于数值运算,常被其他库隐式调用)pandas(如果您的模型期望输入数据为DataFrame)Flask这样的库。scikit-learn==1.0.2、pandas==1.4.1)。可以将其比作一份食谱。您保存的模型文件(model.joblib)是制作一道特定菜肴(即预测结果)的一套指导。依赖则是食谱中列出的确切食材(库)和厨房工具(Python版本)。如果您尝试使用不同版本的食材(例如,scikit-learn 1.1版而不是1.0.2版)来制作这道菜,最终结果味道可能不同,或者食谱可能完全失败。
忽视依赖,当您尝试在新环境(如生产服务器、同事的机器,甚至在更新了一些库后您自己的机器)中使用已保存的模型时,可能导致几个问题:
scikit-learn版本来加载用旧版本保存的模型,可能会直接导致程序崩溃,因为加载函数所预期的内部结构与文件中的结构不匹配。scikit-learn从1.0.1到1.0.2)可能包含错误修复或算法实现中的微小改动。虽然通常是有益的,但这些改动可能意味着新版本加载的模型对相同输入产生略微不同的预测结果,与模型训练和保存时的环境相比。这打破了可复现性的预期。scikit-learn中的StandardScaler),这些对象也依赖于库版本。使用不兼容的版本加载它们可能导致数据在到达模型之前就发生不正确的数据转换。确保预测环境在这些依赖方面精确对应训练环境,是可靠且可复现的机器学习 (machine learning)部署的根本。
Python开发中管理依赖的标准做法涉及两个主要工具:虚拟环境和需求文件。
在您开始为项目安装库之前,应该为其创建一个称为虚拟环境的隔离空间。这个工具会创建一个独立的文件夹,其中包含一个特定的Python解释器,并允许您只为该项目安装库,而不影响您的全局Python安装或其他项目。
常用工具包括:
venv:Python内置(3.3+版本)。通常使用python -m venv myenv(其中myenv是环境名称)创建,并激活(例如在Linux/macOS上使用source myenv/bin/activate,在Windows上使用myenv\Scripts\activate)。conda:在数据科学界尤为常用,是Anaconda发行版的一部分。使用conda create --name myenv python=3.9(指定Python版本)创建,并使用conda activate myenv激活。使用虚拟环境可确保您为一个项目安装的库不会与另一个项目所需的库冲突。
一旦您激活了虚拟环境并安装了必要的库(例如pip install scikit-learn pandas joblib),您需要一种方法来记录哪些库和版本被安装了。这通常通过requirements.txt文件来完成。
您可以使用pip自动生成此文件:
# 确保您的项目虚拟环境已激活
pip freeze > requirements.txt
此命令会列出当前环境中安装的所有包及其确切版本,并保存到requirements.txt文件中。一个典型的文件可能如下所示:
# requirements.txt
joblib==1.1.0
numpy==1.21.5
pandas==1.4.2
scikit-learn==1.0.2
# 可能还有其他自动安装的依赖...
为何使用特定版本(==)? 使用==锁定确切版本。这确保任何使用此文件设置项目的人都将安装与您使用的完全相同的版本,最大限度地提高可复现性。避免使用>=(大于或等于),除非您有特定原因并且了解版本变更的潜在风险。
当您(或其他人)需要在其他地方设置项目环境时,只需创建一个新的虚拟环境,激活它,然后运行:
pip install -r requirements.txt
此命令告知pip安装文件中列出的所有库,使用指定版本。
虽然requirements.txt是非常基础的,但管理复杂环境,特别是那些涉及非Python依赖(如系统库)的环境,会变得更具挑战性。这时像Docker这样的工具就派上用场了,它让您能够将应用程序、其Python依赖、Python解释器本身,甚至部分操作系统打包成一个称为容器的独立单元。我们将在后面的章节中介绍Docker,因为它提供了一种方案来确保开发和部署环境之间的一致性。
目前,勤奋地使用虚拟环境并生成准确的requirements.txt文件,是有效管理模型依赖的必要初步步骤。始终将requirements.txt文件与您保存的模型和预测代码一同保存。它对于使您的模型日后能够使用,和模型文件本身同样重要。
这部分内容有帮助吗?
venv - Creation of virtual environments, Python Software Foundation, 2023 - 创建和管理隔离的Python环境的官方指南,这对于项目间的依赖项一致性非常必要。pip User Guide: Requirements Files, The pip developers, 2023 - 介绍如何使用 requirements.txt 文件声明和安装项目依赖项的文档,以支持可重现的环境。scikit-learn 模型的官方指南,强调匹配库版本对于正确运行和避免问题的重要性。conda 环境的指南,包括指定Python版本和依赖项。© 2026 ApX Machine Learning用心打造