由于众所周知的原因,访问 Google Driver 不是那么地方便,尤其是在下载一些较大的数据集时,尽管可以通过 IDM 来实现断点续传,但下载速度也就只有几 M,对于几十个 G 的文件来说还是太慢了。
偶然间看到一篇使用 Colab 来下载大文件的方法,实验下来速度确实很快,虽然把数据弄到内网要费点周折,但已经算是一个不错的方法,特此记录一下。
访问 Colab 官网,每个人默认有大约 80G 左右的免费空间,如下图所示,这里我下载了一个 53 G 的大文件后,可用空间还有 31 G。
所以,我们可以从 Google Driver 上下载小于 80 G 的文件,如果文件更大的话,此方法可能不适用,或者要升级 Colab 获取更多的硬盘空间。
假设我们要下载的文件地址是下面这个链接:
https://drive.google.com/file/d/1NyDrgI02ao18WmXyepgVkWGqtM3YS3_4/view
那么加粗部分即为文件唯一的 fileID,我们需要通过这个 fileID 来使用命令将文件下载到 Colab 上。
如果是 Google Driver 上的任意文件,我们可以通过右键->共享->复制链接来获得类似上面 URL 形式的一个文件地址。
比如,这个 trainval.json 的地址即为下面这个链接,同理,加粗部分为文件唯一的 fileID。
https://drive.google.com/file/d/1PiaK8BD3D_OyS9rcrGmn9HfLDxnP_MY-/view?usp=sharing
由于整个过程包括文件下载和跨服务器的传输,难免哪一步会出些差错,所以我们需要一个办法来保证每一步得到的文件都是没有问题的,通过 MD5 来验证文件的一致性是一个不错的方案。
所以,我们需要先拿到 Google Driver 上文件的 MD5 值,好在这可以通过 Google 的 API 来获取到。
首先,我们打开 Google Developers - OAuth 2.0 Playground 这个网址,然后,按照下图指示进行第一步操作。
点击完会跳出登录界面,我们用自己的 Google 账号认证然后允许即可。然后,继续按照下图指示进行第二步操作。
第三步,填入 Request URI,然后点击 Send the request,我们就可以在右边的 Response 中得到某一个文件的 MD5 值了。
知道文件的 fileID 后,替换下面加粗部分我们即可得到对应的 Request URI 。
[https://www.googleapis.com/drive/v3/files/1NyDrgI02ao18WmXyepgVkWGqtM3YS3_4?fields=md5Checksum,+originalFilename]
与 1.2 节一样,打开 Google Developers - OAuth 2.0 Playground 这个网址,这里第一步选取了另外的一个 API,然后进行认证。
第二步操作与 1.2 节一致,只不过这里操作完后需要把这个 Access token 复制保存下来,后面要用到。注意这里的 token 有效期为一个小时,超时后无法使用,不过在 Colab 下载的速度可以达到百兆每秒,一个小时可以说绰绰有余。
[!curl -H “Authorization: Bearer Access token” https://www.googleapis.com/drive/v3/files/fileID?alt=media -o filename]
替换上面命令加粗部分的 Access token、fileID 和 filename,就得到了在 Colab 中下载文件的命令,下面是一个示例。
!curl -H "Authorization: Bearer ya29.a0AVvZVsqLM6FcukNv8Co2wOornTU-mktbMSBkIhVQRvU7iHq47UyvXWXcKxV8_RT4Fybs6YmYUAj0EYeWe3CL2wa1T5COZwDb_Mq7w6CDFExvb4Og7tND8QaC3UaZ4FDR5yqwIS5bBJ1LJHeEcE7P6lsoz6LDaCgYKARESARESFQGbdwaIoVi4AMvpUGVnEPyiiFaj1w0163" https://www.googleapis.com/drive/v3/files/1NyDrgI02ao18WmXyepgVkWGqtM3YS3_4?alt=media -o planes_scannet_train.tfrecords
点击左边的执行按钮后,下载就开始了,速度飞起!
但是,我在下载的时候老是会中断,下个几 G 或者十几 G 就停掉了。好在 curl 命令可以从断点重启,修改为下面的命令,继续执行,重复几次后就可以完成下载了。
!curl -H "Authorization: Bearer ya29.a0AVvZVsqLM6FcukNv8Co2wOornTU-mktbMSBkIhVQRvU7iHq47UyvXWXcKxV8_RT4Fybs6YmYUAj0EYeWe3CL2wa1T5COZwDb_Mq7w6CDFExvb4Og7tND8QaC3UaZ4FDR5yqwIS5bBJ1LJHeEcE7P6lsoz6LDaCgYKARESARESFQGbdwaIoVi4AMvpUGVnEPyiiFaj1w0163" -o planes_scannet_train.tfrecords -C - https://www.googleapis.com/drive/v3/files/1NyDrgI02ao18WmXyepgVkWGqtM3YS3_4?alt=media
下载完成后,验证一下 MD5 值,这里一致说明第一步的下载没有问题。
由于 Colab 无法直接访问内网服务器,但是内网服务器可以访问公网,所以这里需要一个公网服务器作为中转,先把文件从 Colab 通过 scp 拷贝到公网服务器,然后在内网服务器上通过 scp 再把文件从公网服务器拷贝到内网服务器。
找一个按小时付费的云服务器,这里我用的是 AutoDL 平台,新用户注册送 10 元优惠券,最便宜的服务器大概 1 元一小时,够下载好几次了。
在 Colab 上生成 SSH-Key,拷贝到公网服务器上。
!ssh-keygen -t rsa # 运行命令后一直回车即可生成 SSH-Key
!cp /root/.ssh/id_rsa.pub ./ # 将公钥拷贝到当期目录
将文件 id_rsa.pub 下载下来,把其中的内容拷贝到服务器上这个文件中 ~/.ssh/authorized_keys2,一般情况下文件名应该是 authorized_keys,我这个服务器叫 authorized_keys2。
假设连接公网服务器的命令如下:
ssh -p 39624 [email protected]
那么,从 Colab 拷贝文件到公网服务器的命令为:
!rsync -avuzP -e "ssh -p 39624 -o StrictHostKeyChecking=no" planes_scannet_train.tfrecords [email protected]:/root/autodl-tmp
我这里用的是 rsync 命令,实测速度会快一些,用 scp 命令也可以。
平均速度大概 30 M,拷贝一个 53 G 的文件用时 27 分。拷贝完成后,同样地,在公网服务器再次验证一下 MD5 值。
登录内网服务器,直接运行以下命令:
rsync -avuzP -e "ssh -p 39624 -o StrictHostKeyChecking=no" [email protected]:/root/autodl-tmp/planes_scannet_train.tfrecords ./
输入公网服务器的登录密码后开始拷贝,平均速度有 40 M,相当可以了。
最后,在内网服务器验证一下 MD5 值,如果一致的话就大功告成了。
如何快速下载google drive文件到本地?
Google Drive MD5 checksum for files