
先把话说在前面被大数据集折腾过的朋友应该都体会过那种“眼看训练集卡在本地传不上去”的绝望。我在 AutoDL 上跑深度学习训练第一次传一个 50GB 的数据集用 WinSCP 直接拖结果拖了一天一夜还没完中途 SSH 一断整批重来心态当场爆炸。这个“云服务器传输大容量数据慢”的问题几乎每个用 AutoDL 的人都绕不开但只要你搞清楚它到底慢在哪、有哪些工具能绕过瓶颈其实完全可以把几天的活压缩到一两个小时。这篇文章就是一套我踩坑踩出来的传输提速方案覆盖压缩、并行传输、断点续传、增量同步、完整性校验这些环节不废话全是可以直接照抄的命令和设置。适合正在跑深度学习训练、需要反复上传数据集和权重文件、或者准备把自家电脑和 AutoDL 实例之间做大批量数据迁移的人。照着做你会发现原来“慢”真不是玄学而是可以一步步拆掉的问题。1. 先别急着换工具把这4个导致慢的原因过一遍1.1 你以为的“服务器慢”其实是本地上行带宽的锅大多数人一遇到传输慢第一反应是“AutoDL 是不是限速了”。但实测下来大部分情况问题出在你自己家宽带的上行带宽上。家用宽带现在下行普遍能给到 300Mbps 甚至 1000Mbps但上行往往只有 30Mbps 到 50Mbps。你上传数据到服务器走的就是上行所以哪怕服务器那边是万兆口你这边也只有 30Mbps 的水龙头。算一笔账你就明白了假设你要传一个 50GB 的数据集50GB 换算成 bit 大概是 50×8×1024÷1024×1024×1024约等于 4.29×10¹¹ 比特。按 30Mbps 上行速率算理论耗时是 4.29×10¹¹ ÷ 30×10⁶约 14300 秒也就是差不多 4 小时。注意这是理论峰值实际走 WiFi、经过路由器转发、路上有丢包重传打个七折到五折都很正常所以 6 到 8 小时才是真实体验。这跟你用哪款传输软件没关系是物理层面的天花板。所以先别急着怪服务器。要判断是不是带宽瓶颈最简单的方法就是打开 Speedtest 测一下你家宽带的“上传速度”如果测出来只有几十 Mbps那你就该在压缩和断点续传上下工夫而不是指望换一个“更快”的 FTP 工具就起飞。1.2 单线程传输和“文件数量太多”才是隐藏的元凶就算你上行带宽有 100Mbps 甚至更高用默认的 SCP、SFTP 工具传大文件往往也跑不满带宽。原因是这类工具默认是单条 TCP 连接在跑而单连接的吞吐量受“带宽延迟积”限制翻译成人话就是你的数据从家里飞到服务器机房来回路程要花多少毫秒决定了这条连接上同时能“在路上”的数据量上限。举个例子家里到 AutoDL 机房的延迟假如是 50msTCP 的拥塞窗口如果没有被调大那这条连接上同时能传输的数据大概只有几 MB 到几十 MB再快也上不去了。这也是为什么很多人在多线程下载里见过“16 线程就是比单线程快好几倍”的现象。另一个容易被忽略的问题是文件数量。如果你要传的是一个包含几十万个小文件的图像数据集每个文件都要经历一次“建立连接—确认元数据—传输—关闭”的过程光握手开销就比你传数据本身还费时间。这种情况你再怎么调大带宽都白搭因为瓶颈变成了文件系统的 I/O 和协议交互。对付它最有效的办法只有一个先打包成一个文件再传后面我会详细说。2. 压缩这一步别省把“一万个小文件”变成“一个文件”2.1 打包不是为了让文件变小而是为了减少“文件数”很多人有误区数据都是图片或者 PyTorch 权重文件了压缩率很低压了也白压。确实对已经压缩过的 JPEG、PNG、模型权重来说gzip 压不出多少空间但你要知道打包tar和压缩gzip/zstd是两回事。即使完全不做压缩只把所有小文件“灌进”一个 tar 包传输速度的提升也是肉眼可见的。原因我在前面说过传 10 万个小文件等于建立 10 万次文件级别的交互而把这 10 万个小文件打成一个 tar 包传输过程就变成“一个文件从头读到尾”。文件系统元数据开销、每个文件的 RTT 等待、确认应答全部省掉了实际测试里小文件从每秒几百 KB 提升到每秒几十 MB 都是正常的。所以哪怕你的数据压缩率只有 1%也建议先 tar 一把再说。2.2 用 pigz 和 zstd 并行压缩别用老式 gzip 单线程硬压默认的tar -czf调用的 gzip 是单线程压缩大文件打包能把 CPU 核数全部浪费掉速度慢得让人着急。更聪明的做法是给 tar 指定一个并行压缩器。本地如果是多核 CPU用 pigz并行 gzip替换 gzip命令是这样的# 安装并行压缩工具 apt install pigz zstd -y # Ubuntu/Debian 本地环境 # 使用 pigz 打包压缩 tar --use-compress-programpigz -cvf dataset.tar.gz ./dataset # 如果追求更快的压缩和解压速度用 zstd 效果更好 tar --use-compress-programzstd -cvf dataset.tar.zst ./dataset我个人现在更推荐 zstd因为它在高压缩级别下比 gzip 快好几倍解压速度更是碾压级。而且 zstd 自带一个很实用的特性你可以指定压缩级别比如zstd -3是快速级别zstd -19是极限压缩训练数据集这种场景用-3到-6就足够毕竟我们的目的是减少文件数不是非要压到极限。解压的时候同样可以并行命令对称着写就行# 解压 gzip 格式 pigz -dc dataset.tar.gz | tar -xf - -C /root/autodl-tmp/ # 解压 zstd 格式 tar --use-compress-programzstd -xf dataset.tar.zst -C /root/autodl-tmp/2.3 超大文件可以分卷防止单文件太大惹麻烦还有一种场景你的数据集超过 100GB打包出来是个大块头结果在传输过程中一旦断线重传的代价非常高而且某些老旧的文件系统对单文件大小还有限制。这时候可以分卷打包每卷切成比如 4GB 或 8GB这样就算某一段传坏了只需要重传那一个分卷不用整个重来。# 打包并切分为 4GB 一卷 tar -cf - ./dataset | split -b 4G - dataset.tar.part- # 在服务器上合并后解压 cat dataset.tar.part-* | tar -xf - -C /root/autodl-tmp/这里有个操作经验分卷传输时一定不要把分卷文件的顺序搞乱合并的时候cat dataset.tar.part-*是按文件名自然顺序拼接的所以命名时用part-aa、part-ab这种也能保证顺序。传完先别急着解压先检查一下分卷数量是否齐全再合并解压能省掉不少返工时间。3. 传输通道选型哪条路上 AutoDL 跑得最快3.1 SCP 真的别用来传大文件它连断点续传都没有SCP 是最常见的传文件命令scp -P 端口 dataset.tar.gz root地址:/root/autodl-tmp/短小精悍但它的短板也很致命单线程而且不支持断点续传。一旦连接中途断掉你传了 90% 的文件直接作废只能从头再来。我早期就被 SCP 坑过好几次90GB 的数据传到 80GB 断了当时真想砸键盘。所以我的建议是日常传个小脚本、小配置文件SCP 没问题但是大文件请直接转向 rsync。3.2 rsync断点续传 增量同步传大文件的首选rsync 是我现在传大量数据到 AutoDL 的默认工具核心原因就一句话它可以断点续传还能只同步变更的部分。先看最常用的命令rsync -avP --partial --progress \ -e ssh -p 你的端口 \ /本地路径/dataset.tar.zst \ rootAutoDL地址:/root/autodl-tmp/关键参数的意思我拆开讲一下-a归档模式保留权限、时间戳等属性-v显示详细信息-P等价于--partial --progress--partial表示如果传输中断保留已经传了一半的文件下次重跑可以从断点继续--progress显示进度条-e ssh -p 端口指定 SSH 端口AutoDL 给的登录端口一般不是默认 22要在这里写上。更妙的是 rsync 的增量能力。你从本地往 AutoDL 传了一个数据集后面在本地改了一部分图片、加了一些样本再跑一遍同样的命令rsync 会先对比两端文件差异只传变化的部分。对于“训练数据反复迭代更新”这个场景来说这个特性几乎是无价的——你不需要每次把整个几十 GB 的数据集重新传一遍几 MB 的增量几分钟就搞定了。我还强烈建议把 rsync 放到screen或tmux里跑这样即使你的 SSH 窗口不小心关了传输进程依然在服务器上继续跑。命令大概长这样screen -S transfer rsync -avP --partial --progress -e ssh -p 你的端口 /本地目录/dataset.tar.zst rootAutoDL地址:/root/autodl-tmp/ # 按 CtrlA 然后按 D 脱离会话之后用 screen -r transfer 回来查看3.3 海量小文件的场景用 Rclone 的多线程更合适如果你的数据不是打包后的单文件而是必须要保留目录结构、并且里面有海量小文件比如几十万个 JSON、图片那 rsync 单线程会有点吃亏。这时候 Rclone 是更好的选择它可以开多个线程同时传相当于多辆卡车同时在路上跑。Rclone 最近几年越来越流行它本身是给网盘同步设计的但它内置了 SFTP 协议可以直接把 AutoDL 当远程盘挂载。配置步骤很简单# 安装 rclone apt install rclone -y # 或者 brew install rclone # 交互式配置一个远程连接 rclone config # 选择 sftp 类型 # 填 AutoDL 的 host 地址、端口、用户名 root密码或密钥认证 # 给这个远程连接起个名字比如 autodl配好之后传数据就是一条命令rclone copy /本地/数据集目录 autodl:/root/autodl-tmp/数据集目录 \ --transfers 8 \ --checkers 16 \ --progress--transfers 8表示同时开 8 个传输线程--checkers 16表示同时检查 16 个文件的状态。实测下来在同样的小文件数据集上Rclone 比单线程 SCP 能快 3 到 5 倍。它的断点续传能力也很强中途断了重跑同一个命令已经传完的文件会直接跳过。选型经验我总结一下单个大文件几 GB 到几百 GB用 rsync没打包的海量小文件用 Rclone强迫症要求两端目录完全一致用 Rclone 的 sync 模式。3.4 想要极限速度临时开个 FTP 多线程或者用 croc 点对点如果你追求极致的传输速度而且只是一次性传大文件可以临时在 AutoDL 上装一个 vsftpd然后用 FileZilla 这种支持多线程的客户端拉满带宽。AutoDL 上临时开 FTP 的操作大概是apt update apt install vsftpd -y # 编辑 /etc/vsftpd.conf确保有下面几行 # local_enableYES # write_enableYES # local_umask022 systemctl restart vsftpd然后本地用 FileZilla 连接在传输设置里把最大并发传输数调到 8 或 16。不过这里必须提醒一句FTP 是明文传输在公网临时开 FTP 是有安全风险的。我的做法是只在传大文件的几十分钟里临时开启传完立刻关掉服务不在服务器上长期保留。如果你对 Linux 防火墙和安全组不熟不建议尝试这条路直接用 rsync 更稳妥。另一个值得试的工具是 croc。它主打“点对点直连”两端都装上 croc一方执行发送另一方执行接收不需要手动输入主机地址自动建立加密通道并传输。用法简单到像发暗号# 在本地发送 croc send --code 123456 /本地路径/dataset.tar.zst # 在 AutoDL 上接收输入同一个 code 即可 croc --code 123456croc 的优点是配置成本几乎为零而且在网络条件允许时能建立点对点直连速度上限很高缺点是如果中间网络复杂会通过公共中继服务器转发这时候速度就取决于中继了。适合临时、一对一的文件传输但不适合作为长期的同步方案。4. 传完不算完解压、校验和日常增量同步4.1 解压别只用 tar并行解压能把等待时间缩短一大截把数据传到 AutoDL 之后很多人直接tar -xzf了事但单线程解压一个几十 GB 的包慢的时候能把你的耐心耗光。跟压缩时一样解压也可以用 pigz 和 zstd 并行解压CPU 核数越多优势越明显。如果你是 zstd 格式直接一条命令搞定tar --use-compress-programzstd -xf dataset.tar.zst -C /root/autodl-tmp/如果你是 gzip 格式解码器换成 pigzpigz -dc dataset.tar.gz | tar -xf - -C /root/autodl-tmp/注意解压的目标路径要选对。AutoDL 的实例通常有系统盘和数据盘之分数据盘的挂载点一般是/root/autodl-tmp这块盘空间更大适合放数据集和训练产物。系统盘容量比较小如果数据集解压到/root下面很可能解压到一半就报No space left on device那时候你才知道什么叫进退两难。4.2 完整性校验千万别省尤其是分卷传输之后我的习惯是传完文件第一件事不是解压而是先校验完整性。传输过程中偶发的丢包、断线、分卷顺序错乱都可能导致解压时报unexpected end of archive或者文件损坏。用 MD5 校验最直观# 本地生成校验文件 md5sum dataset.tar.zst checksum.md5 # 把 checksum.md5 也传到服务器在服务器上校验 md5sum -c checksum.md5如果你的数据实在太大MD5 计算过程本身也要花不少时间还有一个更省事的办法在 rsync 命令里加上-c参数它会强制用校验和而不是文件大小/时间戳来判断两端是否一致。只是这样会多花一些计算时间适合你对一次传输结果不放心的时候用。4.3 把“上传数据”变成“日常习惯”增量同步脚本头几次我都是临时想起来传数据每次手动敲命令麻烦不说还容易漏传新文件。后来我干脆把日常上传固化成一个脚本放在本地每次训练前跑一遍就行。#!/bin/bash # 上传最新数据集到 AutoDL rsync -avP --partial --progress \ -e ssh -p 你的端口 \ /本地工作目录/dataset/ \ rootAutoDL地址:/root/autodl-tmp/dataset/如果你用的是 PyCharm 或 VSCode 的远程开发功能小文件的日常同步用它们自带的上传就行因为它们每次只传你改动的文件单线程慢的问题影响不大。但如果你要往服务器“灌”新的重量级数据集请务必回到命令行用 rsync 或 Rclone不要指望 IDE 的 SFTP 面板能干这活——我试过用 PyCharm 传 10GB 文件中途卡死进度条永远停在 99%。5. 常见问题与排查技巧实录5.1 传了大半天SSH 断了怎么办这是所有人都会遇到的噩梦。我的建议分两层第一层如果你提前用了 rsync 的--partial或-P问题就简单了重新跑一遍同样的命令它会从断点接着传已经传好的部分不会重来第二层如果当初用 SCP那没办法只能从头传。这也是我为什么反复强调“SCP 别传大文件rsync 才是大文件的正道”。顺便说一个好习惯所有长耗时任务不论是传输还是训练都丢到screen或tmux里跑。这样即使断网、SSH 窗口意外关闭、笔记本合盖任务都还在服务器上好好待着。5.2 传完了但解压报错或者训练时找不到文件解压报错大概率是文件不完整优先按上面说的 MD5 校验一版。如果校验是对的但解压仍然报错可能是 tar 包本身在打包时就出了问题或者分卷合并时顺序不对。训练时找不到文件多半是路径问题。AutoDL 上/root/autodl-tmp和/root是两个不同层级你上传到/root/autodl-tmp但训练脚本写的是/root/dataset自然找不到。建议解压前先tar -tf看一眼包内的顶层目录结构再决定解压到哪# 只看包里有啥不解压 tar -tf dataset.tar.zst | head -n 205.3 明明带宽不少为什么速度还是忽快忽慢先确认一下是不是有东西在偷跑带宽。比如本地开着百度网盘、迅雷、系统自动更新这些都会挤压你上传给 AutoDL 的带宽。其次如果你用的是无线网络信号不好或者路由器性能弱也会导致速度波动这种时候换成有线网效果立竿见影。还有一点容易被忽略AutoDL 实例所在的物理节点位置不同线路质量差别很大。同一个账号、同一份数据换一个可用区的新实例传输速度可能完全不一样。如果长时间速度上不去可以试试关掉实例重新开一台有时候能捡到线路更好的节点。5.4 提示磁盘空间不足多半是“压缩包 解压后”占了两份空间一个常见陷阱你把 50GB 的压缩包传到服务器解压出来 60GB 的实际数据于是数据盘需要同时容纳“压缩包 50GB 解压后 60GB 110GB”。如果你的数据盘总共才 100GB那解压进行到一半就会直接失败。解决办法也很简单先df -h确认数据盘剩余空间解压前预估一下解压后大小空间不够就先别留压缩包或者分几次解压。我现在的习惯是数据一旦解压成功并校验通过立刻删掉服务器上的 tar 包把空间留给真正在训练时要产生的模型权重和日志文件。5.5 AutoDL 实例被释放后数据会丢这点必须单独拿出来说。AutoDL 的云服务器不同于你家里的硬盘关机状态下只要实例没释放数据盘还在但如果你主动释放了实例那些数据就真的没了。我见过太多人辛苦传上去的数据集因为忘了续费或者误操作释放实例第二天全部清零只能重新传一遍。所以传上去的重要数据务必定期把训练产物和权重文件增量同步回本地千万别把云服务器当成永久存储。我最后补一句实际经验这一套流程跑下来我现在传数据的速度和早期完全是两个世界。50GB 数据集从“一天一夜还断线”变成了“打包压缩 20 分钟 rsync 传输 1 小时”并且中途断了也能接着跑心里一点都不慌。尤其是 rsync 的增量同步配合本地的数据迭代已经变成了我的固定工作流。如果你现在也被 AutoDL 传大文件折磨得想摔电脑我建议你先别追求什么“一键加速工具”老老实实按这个顺序走先测一下本地上行带宽再用 zstd 打包然后用 rsync 或 Rclone 传输最后记得校验和解压到/root/autodl-tmp。这四步里面任何一步都能省下你大量时间关键是每一环都要做对而不是指望某个单一神器帮你一劳永逸。