在google-colab中,保存已有的module环境到google drive后调用时遇到问题

在google-colab中,保存已有的module环境到google drive后调用时遇到问题

我尝试通过在运行代码时将 Python 环境和模型保存到自己的 Google Drive 中,从而改进 Google Colab 文档。这样,在删除运行时并在第二天使用代码时,可以无需下载全部内容即可正常运行。

我使用了虚拟环境方法来下载模块。模型下载部分进行得很顺利,但在尝试调用已保存的模块时遇到了问题(我认为它们已保存,但在尝试使用时无法调用)。

Colab 链接:https://colab.research.google.com/drive/1y8NHYiItax3yvKLy6BbcLwGP4Kjq_FZU?usp=sharing *对于混乱的代码表示抱歉.我对 Python 还不太熟悉.

以下是代码中设置参数的部分:

# 配置 vits 所在文件夹名称
Drive_Name = 'Vi' #@param {type:'string'}

# 连接到 Google Drive
drive.mount('/content/gdrive')
gdrive_path = '/content/gdrive/MyDrive/'

# 创建目录
vi_dir = os.path.join(gdrive_path, Drive_Name)
webui_dir = os.path.join(gdrive_path, Drive_Name, 'vits-models')

以下是下载模块的部分:

#@title 6-下载需要的模块(忽略)
!pip install virtualenv
!virtualenv /content/gdrive/MyDrive/colab_env
!source /content/gdrive/MyDrive/colab_env/bin/activate; python3 -m pip install pip==21.3.1; pip install -r $webui_dir/requirements.txt

import sys
sys.path.append("/content/gdrive/MyDrive/colab_env/lib/python3.8/site-packages")

以下是出现问题的部分(在尝试运行程序时):

import sys
sys.path.append("/content/gdrive/MyDrive/colab_env/lib/python3.8/site-packages")
import numpy
print('Yes')
!source /content/gdrive/MyDrive/colab_env/bin/activate && /content/gdrive/MyDrive/colab_env/bin/python3 $webui_dir/app.py --share --device cuda --all

最后这段代码返回以下结果:

Yes
Traceback (most recent call last):
  File "/content/gdrive/MyDrive/Vi/vits-models/app.py", line 5, in <module>
    import utils
  File "/content/gdrive/MyDrive/Vi/vits-models/utils.py", line 7, in <module>
    import numpy as np
ModuleNotFoundError: No module named 'numpy'

我感到非常困惑。我可以看到 numpy 已经存在于我的虚拟环境中,而且我认为路径设置没有错误。我还将其添加到 sys.path 中,但问题仍然存在。

我尝试将最后一段代码改为:

import sys
sys.path.append("/content/gdrive/MyDrive/colab_env/lib/python3.8/site-packages")
import numpy
print('Yes')
!python3 $webui_dir/app.py --share --device cuda --all

现在返回:

Yes
Traceback (most recent call last):
  File "/content/gdrive/MyDrive/Vi/vits-models/app.py", line 9, in <module>
    import gradio as gr
ModuleNotFoundError: No module named 'gradio'

我在 site-packages 文件夹中进行了检查,确实找不到 gradio 文件夹。但是当第一次运行模块安装代码时,我可以在控制台中看到以下内容:

Collecting gradio==3.17.0
Using cached gradio-3.17.0-py3-none-any.whl (14.2 MB)

这是我的 Google Drive 结构:

img

img

顺便说一下,gradio 不在 site-packages 文件夹中)

因此,我真的很困惑代码的哪一部分出了问题. 请有人能帮忙吗?或者使用不同的方法来实现这个功能. 欢迎访问链接 (在问题上面)尝试运行代码(包含错误)。

我期望代码在删除运行时并打开新的运行时后能再次运行。结果是,代码只在安装模块的运行时中正常运行,而在打开新的运行时后无法正常运行。

提前感谢!

引用gtp回答 有帮助的采纳一下哟
仔细检查了你的代码和环境,发现有几个可能的原因导致无法调用保存的模块:

  1. 虚拟环境被删除。你使用了virtualenv创建了虚拟环境,但运行第二天时该环境可能被Colab删除了。建议你将虚拟环境也保存到Google Drive,在第二天加载时重新激活它。
  2. 模块的路径发生了变化。你保存的模块的相对路径发生变化,导致Python无法找到它们。建议使用绝对路径来保存和调用模块。
  3. 没有重新挂载Google Drive。你忘记在第二天的运行中重新挂载Google Drive,导致Python找不到保存在其中的模块。需要添加drive.mount('/content/gdrive')来重新挂载。
  4. 没有在新环境中安装要调用的模块。有些模块在虚拟环境中可用,但在普通环境下还需要安装。需要在第二天环境中使用pip安装这些模块。
    针对上述4点,我有以下建议:
  5. 将virtualenv也导出保存到Google Drive,在第二天运行前加载它。命令为:
    virtualenv myenv
    source myenv/bin/activate  # 激活环境
    # 保存环境
    zip -r myenv.zip myenv 
    
  6. 在保存和调用模块时使用绝对路径,而不要相对路径。
  7. 在第二天运行前首先使用drive.mount('/content/gdrive')重新挂载Google Drive。
  8. 检查所调用模块是否在新环境中可用,如果不是,使用pip进行安装。
  9. 在导出虚拟环境和模块时,也将相关的pip list导出,在第二天环境中使用它来安装所有需要的模块。

基于new bing部分指引作答:
问题可能是由于虚拟环境的设置和调用方式引起的。虚拟环境的激活和调用需要在同一个命令或脚本中完成,而在Colab中使用感叹号(!)运行的命令是在独立的子进程中执行的,无法保持环境的连续性。

为了解决这个问题,你可以尝试以下方法:

1、将所有安装模块和启动应用程序的命令整合到一个脚本中,并使用 ! 运行该脚本。这样可以确保所有命令在同一个环境中执行,避免环境切换问题。例如,你可以创建一个名为 run_app.sh 的脚本,内容如下:

#!/bin/bash

source /content/gdrive/MyDrive/colab_env/bin/activate
pip install -r /content/gdrive/MyDrive/Vi/vits-models/requirements.txt
python /content/gdrive/MyDrive/Vi/vits-models/app.py --share --device cuda --all

然后在Colab中运行该脚本:

!bash run_app.sh

2、将需要的模块和应用程序复制到Colab的运行时中,而不是在每次运行时下载和安装。你可以将模块和应用程序文件夹直接上传到Colab,然后在Colab中直接导入和使用它们,而无需使用虚拟环境和Google Drive。
你可以通过以下步骤来实现:

在本地计算机上将所需的模块和应用程序文件夹打包为一个zip文件。
将zip文件上传到Colab中(可以使用Colab的文件上传功能)。
在Colab中解压缩zip文件,并将模块和应用程序导入到你的代码中。
这样,你就不需要在每次运行时都下载和安装模块,而是直接使用Colab中的本地副本。

希望以上解决方案能够帮助你解决问题。

虚拟环境路径设置不正确吧

把Colab运行后生成的文件保存到Google drive

!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse
from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}

!mkdir -p drive
!google-drive-ocamlfuse drive

from google.colab import drive
drive.mount('/content/drive/')

进入指定目录,因为我的代码是直接新建后跑的,因此与drive都在\content目录下

import os
os.chdir('/content')