尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

AutoDL大容量数据传输提速实战:从打包到rsync的完整方案

AutoDL大容量数据传输提速实战:从打包到rsync的完整方案 先说我自己的经历吧。前阵子帮一个朋友把 60GB 左右的检测数据集搬到 AutoDL 上进行训练他用网页端的上传按钮传了一下午进度条才走到 8%中途还断了一次气得差点把笔记本合上。这个场景对用过 AutoDL 的人来讲应该不陌生明明 GPU 算力很香结果数据进不了机器训练一直等。我在 AutoDL 上跑模型也有两年多了数据传输慢、断线、文件损坏、传完发现路径不对这类问题基本都踩过一遍。这篇文章就把我实际用下来有效的提速办法从头到尾梳理一遍覆盖压缩打包、rsync 增量传输、多连接并发、平台自带的无卡模式和文件存储等场景。目标很简单让你在传大容量数据的时候不再干等一晚上而是尽量用最短的时间把数据安全送进实例。1. 为什么大容量数据传到 AutoDL 这么慢1.1 先认清数据链路瓶颈不一定在“传输工具”很多人第一反应是换工具从网页上传换成 WinSCP、FinalShell 或者 scp 命令但换完发现速度还是那个死样子。原因很简单AutoDL 实例本质是一台位于数据中心的云服务器你本地访问它走的还是公网。公网链路的带宽和延迟决定了你的上限工具只是把这份带宽能用到几成而已。我打个比方这就好比你要从城市 A 送一车货到城市 B高速路的限速是固定的换一辆马力更大的车并不能让你超速。真正能影响全程时间的是你在装货、卸货、路上停靠这些环节上浪费了多少时间。对应到数据传输里公网链路就是那条限速高速路而压缩、打包、并发连接就是装货和调度方式。所以第一步不是纠结用什么传输软件而是先判断你本地上行带宽有多少云服务器那边下行带宽有多少两边链路延迟ping 一下大概多少毫秒如果本身上行带宽只有 10Mbps那任何工具都很难突破 1.2MB/s 左右的物理上限这时候所有优化都得围绕“减少传输量”来做比如压缩和增量同步。1.2 单连接 SFTP 的隐藏天花板即便你本地带宽很大比如是 300Mbps 的家庭宽带你用一条默认的 scp 命令去传一个大文件也常常只能跑到 10~20MB/s离 300Mbps约 37.5MB/s还有很大差距。这里涉及 TCP 传输的一个基础限制吞吐量大约等于 TCP 窗口大小除以往返延迟RTT。举个例子如果链路 RTT 是 50msTCP 窗口是 64KB那么理论极限大概就是 64KB / 0.05s ≈ 1.3MB/s。实际场景中服务器和家用网络的带宽延迟积很大单连接的窗口扩展可能没调到位或者中间网络设备限制了单流带宽都会导致速度卡在一个不高的数值上。这也是为什么很多人开一个 scp 传大模型权重死活跑不满带宽的原因。我自己在本地和 AutoDL 之间测过单个 SSH/SFTP 连接传大文件时速度经常在 8~15MB/s 之间徘徊。而如果用多个连接并发传多个文件总速度往往能明显上去。这说明并不是带宽本身不够而是单条 TCP 流被链路质量、窗口大小等因素限制住了。理解了这一点后面选择并发方案就有依据了。1.3 小文件数量才是隐藏最深的杀手比带宽更折磨人的是海量小文件。假设你的数据集是几万张图片每张几十 KB即便总容量不大用 SFTP 传输时依然会非常慢。原因是每传一个文件都需要建立或复用连接、交换元数据、等待确认一次 RTT 可能只有 50ms但几万个文件累积起来就是几十分钟甚至几小时的额外开销。我踩过的真实案例一个 8GB 的图片数据集单张图片平均 20KB 左右总数大概四十万张。我一开始直接 rsync 整个目录跑了快三个小时还没完。后来先打包成一个 tar 文件再传总用时不到十分钟。这个差距是数量级的不是工具能弥补的。所以只要你的数据是海量小文件无论用什么工具第一步都应该先合并成大文件。2. 传输前先压缩打包最快的优化手段2.1 打包和压缩是两件事先搞清楚要哪个打包tar是把很多文件合并成一个文件流压缩gzip、zstd是把这个流变薄。很多海量小文件的场景其实“打包”这一步带来的收益最大因为它把几十万次文件传输的 RTT 开销变成了一次连续数据流传输。压缩只是额外减少体积锦上添花。实际操作中我一般这样判断如果是图片、视频、权重这类本身就不太好压缩的数据只打包不压缩或者用低压缩级别速度优先。如果是文本、代码、日志、JSON 这类重复度高的数据用 zstd 或 gzip 压缩能压掉很大比例体积。如果你的 CPU 很强而带宽很弱压缩级别拉高一些也值得反过来带宽很强而 CPU 一般就别上高压缩级别否则压缩时间比传输省下的时间还多。2.2 tar zstd 打包一条龙我自己现在最常用的是 tar 加 zstd 组合。zstd 比 gzip 快得多压缩率也好而且支持多线程。如果你的 AutoDL 实例或者本地环境没装 zstd先装一下# Ubuntu/Debian apt update apt install -y zstd # macOS brew install zstd打包并压缩一个数据集目录tar -I zstd -cf dataset.tar.zst ./dataset解释一下参数-I zstd指定使用 zstd 作为压缩程序-cf是创建文件。这样生成的文件是dataset.tar.zst。默认压缩级别对大部分场景够用如果你想让压缩更快可以用tar -I zstd -1 -cf dataset.tar.zst ./dataset想压得更狠用-19但时间会明显变长。对网络传输场景我一般用-3到-8之间兼顾速度与压缩率。在 AutoDL 实例上解压也很简单tar -I zstd -xf dataset.tar.zst -C /root/autodl-tmp/这里多说一句AutoDL 的数据盘一般挂在/root/autodl-tmp系统盘空间有限而且实例释放后未保存到数据盘的数据可能丢所以我习惯把所有大文件都先放到/root/autodl-tmp下再解压避免最后发现磁盘不够或者数据没保住。2.3 应对超大盘分卷压缩加 md5 校验当单个打包文件大到几十 GB上传时一旦中途断开整个文件就要重来。我建议先分卷再传断点损失能控制在单卷大小内。分卷命令示例tar -I zstd -cf - ./dataset | split -b 4G - dataset.part_这会生成dataset.part_aa、dataset.part_ab这样每卷 4GB 的文件。先计算一下原始 tar 流的 md5再上传到 AutoDL 上合并并解压# 本地生成校验文件 tar -I zstd -cf - ./dataset | md5sum dataset.tar.zst.md5 # AutoDL 上合并 cat dataset.part_* dataset.tar.zst # 对比校验 md5sum -c dataset.tar.zst.md5 # 解压 tar -I zstd -xf dataset.tar.zst -C /root/autodl-tmp/分卷的另一个好处是你可以在本地一边生成分卷一边上传不用等全部压缩完成再传。对于动辄上百 GB 的数据集这个流程能让整体等待时间缩短一大截。3. 换连接方式rsync 与多连接 SFTP3.1 用 rsync 实现断点续传和增量同步打包压缩解决的是“一次性大量数据”的问题但日常训练过程中数据和代码经常是频繁改动的。比如你已经上传了 40GB 数据训练时又新增了 2GB 样本重新打包全部上传就太蠢了。这时候 rsync 是最合适的工具它只传输差异部分而且支持断点续传。我平时从本地 Linux 或 macOS 往 AutoDL 传数据的命令长这样rsync -avzP --partial -e ssh -p 12345 ./dataset/ rootconnect.xxx.seetacloud.com:/root/autodl-tmp/dataset/参数逐个说明-a归档模式保留权限、时间戳等信息。-v显示详细输出方便观察进度。-z传输时压缩适合文本类文件但如果文件已经打过包可以去掉避免浪费 CPU。-P等于--partial --progress保留部分传输的文件并且显示进度。--partial很重要遇到网络断开已经传了一半的文件不会被删除下次续传接着来。-e ssh -p 12345指定 SSH 端口。AutoDL 的 SSH 端口不是默认 22控制台里会给具体命令直接照抄里面的端口和主机地址。如果你和我一样喜欢把传输扔到后台跑不占用当前终端可以配合 nohupnohup rsync -avzP --partial -e ssh -p 12345 ./dataset/ rootconnect.xxx.seetacloud.com:/root/autodl-tmp/dataset/ rsync.log 21 然后随时用tail -f rsync.log看进度。这个操作对长时间传输特别友好即使本地终端关掉传输进程也不受影响。3.2 从 Windows 传文件怎么办Windows 下我常用的两个工具是 WinSCP 和 FileZilla。注意一点这类图形化 SFTP 工具对单个大文件通常还是单连接传输多个小文件可以并发。所以如果你想传一个已经打包好的大 tar 文件别指望它在图形界面上能跑满多线程如果你想传一堆零散文件可以把并发数调大。FileZilla 的设置路径是编辑 → 设置 → 传输 → 最大同时传输数我一般调到 8~16。WinSCP 里可以在“后台传输”里把并发连接数调高但单个大文件的提升有限。最终结论还是那句小文件先打包成一个大文件让图形工具只处理一个文件反而更省心。另外从 Windows 也可以用 rsync比如用 WSL 里的 rsync或者用 Git Bash 自带的 rsync可能版本较老。我试下来最顺的组合是WSL 里装好 rsync然后用和 Linux 一样的命令操作。如果实在不想折腾那就用 WinSCP 直接拖大文件速度慢点但胜在简单。3.3 从 AutoDL 下载训练结果一样的原则训练完成后要把 checkpoint、日志、模型文件搬回本地很多人直接右键下载几十万个文件能下到怀疑人生。我的标准做法是先在 AutoDL 实例上把训练产物打包成一个文件再用 rsync 拉回本地。打包指令cd /root/autodl-tmp tar -I zstd -cf output.tar.zst ./output回到本地执行rsync -avzP --partial -e ssh -p 12345 rootconnect.xxx.seetacloud.com:/root/autodl-tmp/output.tar.zst ./如果你的 checkpoint 本身就很大也可以只打包不压缩毕竟模型权重和优化器状态压缩率很低白白占用 CPU。判断标准还是看瓶颈文件数量多就打包文件体积大且带宽低就压缩。4. AutoDL 平台专属的提速路径4.1 无卡模式低成本做数据搬移AutoDL 一个很实用的功能是“无卡模式开机”。在你不需要 GPU 算力的时候比如只上传数据、整理文件、解压打包完全可以开着无卡模式进行操作费用比正常开机低不少。等数据准备完毕再切回 GPU 模式开始训练。这个操作看似和数据传输速度无关但它解决了一个实际问题很多人在 GPU 机器上边传数据边计时传得慢了心疼钱。改用无卡模式后你可以在低成本的机器上慢慢传、慢慢解压传完再换到训练机器。尤其在数据量很大的时候省下的费用相当可观。我自己习惯的流程是开一台无卡模式的实例把数据传进/root/autodl-tmp并解压好然后关闭实例用训练实例时再把数据从这台机器的数据盘同步过去或者直接把数据保存在平台的公共文件存储中让多个实例共享读写。这样既省了 GPU 计费又不影响数据准备。4.2 利用平台文件存储和公共数据集AutoDL 的文件存储相当于一个多个实例都能访问的公共网盘。它的原理是把数据放到一个独立存储节点然后实例通过网络挂载访问。对“多台机器要共用同一份数据”的场景特别合适。如果只是单实例训练直接放在本地数据盘就行但如果要频繁在不同实例之间迁移、或者多个实例需要同一份数据集就别每台都传一遍而是传到文件存储里让所有实例都从那里读取。实际操作中我会先把大数据集用 rsync 传到文件存储挂载目录然后在训练实例里通过挂载路径直接读取。这样做不仅能避免重复传输还能让多机并行训练时大家拿到一致的数据。注意文件存储的读写性能一般不如本地数据盘所以训练时建议把常用小文件拷贝到本地或者至少确认读取带宽满足你的数据加载需求。4.3 同区域多实例分发与数据迁移如果你开了多台实例或者想把数据从旧实例迁移到新实例可以考虑“先传一台再从实例间分发”的思路。AutoDL 在同一区域的实例之间通常比本地公网到云端更快。我一般先在一台实例上把数据准备好然后用 rsync 从这台实例往其他实例推或者反过来拉取。命令和本地传输一模一样只是源和目标都换成了 AutoDL 实例的 SSH 地址。另外训练完如果要长期保留数据建议不要把数据只留在实例本地盘上而是同步到平台的文件存储或者打包下载到本地再归档。实例释放后未持久化的数据可能会被清理。这个教训我印象很深有次我模型训练到一半实例到期释放忘了把数据盘内容同步出去结果损失了一整天的实验产出。从那以后凡是重要 checkpoint我一定在训练过程中就定期同步到文件存储或者本地绝不在实例盘上放唯一副本。5. 常见问题速查与排障实录5.1 传大文件时 SSH 连接被重置现象是 rsync 或 scp 传了一会儿直接报Connection reset by peer或者kex_exchange_identification然后传输中断。常见原因有三个本地或服务端网络不稳定长时间大流量传输被中间设备掐断。SSH 连接因为长时间没有活动被服务器断开虽然传输本身有数据流但某些网络设备对长连接不友好。本地网络出口 IP 变化或者带宽被打满导致连接中断。我的处理方案是短链路问题用--partial加断点续传兜底长链路问题用ServerAliveInterval参数保持连接活跃rsync -avzP --partial -e ssh -p 12345 -o ServerAliveInterval30 -o ServerAliveCountMax3 ./dataset/ rootconnect.xxx.seetacloud.com:/root/autodl-tmp/dataset/ServerAliveInterval30表示每 30 秒发送一个心跳包防止连接被闲置断开。加上--partial后即便真的断开重新执行同一条命令也能续传不用从头开始。5.2 速度始终上不去可能是 CPU 压缩拖后腿有次我在本地用高压缩级别传了一份 JSON 日志数据集结果 CPU 直接拉满传输速度反而只有 5MB/s。后来发现瓶颈不在网络而是压缩过程跟不上。解决方法是把压缩级别调低或者干脆不压缩只打包。判断方法是看任务管理器如果 CPU 接近 100%而网卡占用率很低说明卡在压缩计算上如果 CPU 不高但速度上不去才可能是网络瓶颈。还有一个容易忽略的点rsync 的-z参数和 tar 的 zstd 压缩是两回事。如果你已经用 tar 打成了.tar.zst再让 rsync 加-z二次压缩纯属浪费 CPU。正确做法是去掉 rsync 的-z只保留打包压缩那一次。5.3 传完文件校验不一致多半是本地没先算好哈希文件传完以后训练时报数据读取错误排查了半天发现是传输过程中文件损坏。这个概率虽然不高但一旦发生很恶心。最稳妥的办法是在本地先算好 MD5 或 SHA256传到 AutoDL 后再算一次对比。对单个大文件# 本地 md5sum dataset.tar.zst dataset.tar.zst.md5 # AutoDL cd /root/autodl-tmp md5sum -c dataset.tar.zst.md5对目录建议打包后再校验而不是对目录逐个文件比对否则几万个小文件的哈希计算也浪费时间。如果你用 rsync其实它默认会通过校验确认文件完好的不过实现方式不一定是全文哈希所以对特别重要的训练数据我还是会单独做一次完整校验。5.4 常见问题速查表问题可能原因推荐解法网页上传进度极慢单连接 无断点续传放弃网页端改用 rsync / WinSCP小文件几十万个传不完文件系统交互开销大tar 打包成一个大文件再传单个大文件速度只有 10MB/sTCP 单连接限制分卷后用多连接并发上传传到一半断线重新传一遍没有启用断点续传rsync 加--partial重跑同命令实例释放后数据没了数据只放在系统盘重要数据放数据盘 / 同步到文件存储CPU 占用高但速度上不去压缩级别过高降低 zstd 级别或只打包不压缩训练结果下载太慢小文件太多先打包再 rsync 拉取5.5 我的最终推荐流程如果你现在正准备往 AutoDL 传一批大容量数据直接按下面这套流程走基本能把传输时间从“绝望”降到“可接受”先统计数据目录的总大小和文件数量。如果文件数量超过几千个用 tar 打包需要压缩就加 zstd不需要就纯打包。如果单个打包文件超过 10GB分卷到 4GB 或 8GB并生成 md5 校验文件。开一台无卡模式的 AutoDL 实例用 rsync 命令传输分卷文件能挂后台就挂后台。所有分卷传完后在实例上合并、校验、解压到/root/autodl-tmp。如果训练需要多台实例共享数据不要重复传输把数据放到文件存储挂载目录里。每次训练完checkpoint 及时同步到本地或文件存储避免实例释放导致损失。这套流程我用了很久踩过不少坑才固定下来。最关键的一点其实是不要偷懒跳过打包这一步尤其是海量小文件打包一次的收益比任何网络调优都大。而真正传输阶段rsync 的断点续传和增量同步能力能保证你在网络不稳的情况下依然睡个安稳觉。希望这篇内容能让你下次往 AutoDL 传数据时少走弯路把时间花在调模型上而不是盯着进度条发呆。
返回列表