在 Linux 或 macOS 的终端中,进入子目录主要通过 cd
(change directory)命令实现。以下是具体方法和常见场景的详细说明:
登陆ssh
ssh user@remote
#回车后输入密码即可
进入下一级子目录
cd 子目录名
示例:
当前路径为 /home/user
,想进入 projects
子目录:
cd projects
# 现在路径变为 /home/user/projects
cd ..
# 路径会从 /home/user/projects 返回到 /home/user
cd 父目录/子目录/子子目录
示例:
从 /home/user
直接进入 /home/user/projects/python/src
:
cd projects/python/src
cd ~
# 或简写为
cd
cd /
cd -
输入目录名的前几个字母后按 Tab 键自动补全(避免输错):
cd pro<Tab> # 自动补全为 cd projects/
用引号包裹或使用反斜杠转义:
cd "my project"
# 或
cd my\ project
若目录需要权限,先用 ls -l
检查权限:
drwxr-x--- 2 root root 4096 Jun 5 10:00 admin_dir
需切换用户或提权:
sudo su # 切换为 root
cd admin_dir
先用 ls
确认子目录名称是否正确:
ls # 查看当前目录内容
cd subdir # 确保 subdir 存在
mkdir -p new_folder && cd new_folder
# 找到名为 src 的目录路径(需安装 find 命令)
cd $(find ~ -type d -name "src" 2>/dev/null | head -1)
PyCharm 的本地或远程终端同样支持上述命令。
注意:
cd
改变的是远程服务器的路径,而非本地路径。Tools → Start SSH Session
打开独立的远程终端。命令 | 作用 | 示例 |
---|---|---|
cd dir |
进入当前目录的子目录 | cd projects |
cd .. |
返回上一级目录 | cd .. |
cd /full/path |
直接进入绝对路径 | cd /usr/local/bin |
cd ~ |
快速回到用户主目录 | cd ~ |
cd - |
返回上一个所在的目录 | cd - |
掌握这些方法后,你可以高效地在终端中导航目录结构。对于远程开发,记得区分本地和远程的当前路径(通过 pwd
命令随时验证)。
在通过 SSH 操作远程服务器时,将本地文件与远程服务器的当前目录对应起来,通常需要 文件同步 或 路径映射。以下是几种常见方法,确保你在本地和远程之间高效、准确地管理文件:
scp
或 rsync
同步文件# 语法:scp [本地文件] [用户@远程主机:远程路径]
scp ./local_file.txt user@remote_server:~/ # 复制到远程家目录
scp ./local_file.txt user@remote_server:"$(pwd)" # 复制到远程当前目录
pwd
会解析为远程的当前路径(需确保远程当前目录存在)。# 语法:scp [用户@远程主机:远程文件] [本地路径]
scp user@remote_server:~/remote_file.txt ./
scp user@remote_server:"$(ssh user@remote_server 'pwd')/remote_file.txt" ./
rsync
(更高效,支持增量同步)rsync -avz ./local_file.txt user@remote_server:"$(ssh user@remote_server 'pwd')"
vim
/nano
over SSH)ssh user@remote_server "nano $(pwd)/remote_file.txt"
ssh user@remote_server "ls -l $(pwd)"
#!/bin/bash
REMOTE_DIR=$(ssh user@remote_server 'pwd') # 获取远程当前目录
scp ./local_file.txt user@remote_server:"$REMOTE_DIR"
echo "文件已同步到远程路径: $REMOTE_DIR"
inotifywait
工具)# 监听本地目录变化并自动同步到远程相同路径
LOCAL_DIR="$(pwd)"
REMOTE_DIR=$(ssh user@remote_server 'pwd')
inotifywait -m -r -e modify,create,delete "$LOCAL_DIR" |
while read path action file; do
rsync -avz "$LOCAL_DIR/" user@remote_server:"$REMOTE_DIR/"
done
配置远程解释器:
File → Settings → Python Interpreter → Add → SSH Interpreter
手动同步文件:
Deployment → Upload
(上传到远程对应路径)。路径一致性:
./project/src
对应远程 ~/project/src
)。权限问题:
ls -ld
检查权限)。符号链接:
pwd -P
获取物理路径。网络延迟:
rsync --progress
显示进度。需求 | 命令示例 |
---|---|
同步本地文件到远程当前目录 | scp ./file user@remote:"$(ssh user@remote 'pwd')" |
编辑远程当前目录的文件 | ssh user@remote "nano \$(pwd)/file.txt" |
实时同步目录 | rsync -avz ./dir/ user@remote:"$(ssh user@remote 'pwd')/" |
获取远程当前目录路径 | REMOTE_DIR=$(ssh user@remote 'pwd') |
通过以上方法,你可以精准地将本地操作映射到远程服务器的当前目录,避免路径错误导致的文件丢失或覆盖。对于频繁操作,建议使用 SSH 密钥认证 和 自动化脚本 提升效率。
将当前本地文件夹复制到远程服务器的目录下,可以通过以下方法实现。这里以 rsync
和 scp
两种常用工具为例,提供详细步骤和注意事项:
rsync
(推荐,支持增量同步)rsync -avz --progress ./local_folder/ user@remote_server:/path/to/remote/directory/
参数 | 作用 |
---|---|
-a |
归档模式(保留文件属性、权限、符号链接等) |
-v |
显示详细输出 |
-z |
压缩传输(节省带宽) |
--progress |
显示传输进度 |
末尾 / |
同步文件夹内容(不加 / 会同步文件夹本身) |
# 将当前目录下的 `project` 文件夹同步到远程的 `/home/user/backup/`
rsync -avz --progress ./project/ [email protected]:/home/user/backup/
如果远程目录不存在,rsync
会报错。可先创建目录:
ssh user@remote_server "mkdir -p /path/to/remote/directory"
如需排除特定文件(如 node_modules
):
rsync -avz --exclude='node_modules/' ./project/ user@remote_server:/backup/
scp
(简单但效率较低)scp -r ./local_folder user@remote_server:/path/to/remote/directory/
参数 | 作用 |
---|---|
-r |
递归复制整个目录 |
# 将当前目录下的 `project` 文件夹复制到远程的 `/home/user/backup/`
scp -r ./project [email protected]:/home/user/backup/
scp
会全量传输文件,不适合大文件夹或频繁同步。tar czf - ./local_folder | ssh user@remote_server "tar xzf - -C /path/to/remote/directory"
命令部分 | 作用 |
---|---|
tar czf - |
将本地文件夹压缩为流(不生成临时文件) |
tar xzf - -C |
在远程解压到指定目录 |
# 压缩传输当前目录到远程的 `/backup/`
tar czf - ./ | ssh [email protected] "tar xzf - -C /backup/"
问题:Permission denied
解决:
确保远程目录可写:ssh user@remote_server "chmod 755 /path/to/remote/directory"
或用 sudo
提权(需有权限):
rsync -avz ./project/ user@remote_server:/sudo/path/ --rsync-path="sudo rsync"
rsync
:重新执行命令会自动续传。scp
:需完全重新传输。默认情况下,rsync
会同步符号链接本身。如需跟随链接(复制实际文件),加 -L
:
rsync -avzL ./project/ user@remote_server:/backup/
场景 | 推荐工具 | 优点 |
---|---|---|
首次同步大文件夹 | rsync |
支持断点续传、进度显示 |
简单快速复制小文件夹 | scp |
命令简单直观 |
需要高压缩比 | tar + ssh |
节省带宽,适合慢速网络 |
最终推荐命令(平衡效率和易用性):
rsync -avz --progress ./local_folder/ user@remote_server:/remote/path/
执行后输入远程服务器密码(或配置 SSH 密钥免密登录),即可完成同步。
在远程终端中,退出当前目录通常是指返回到上一级目录或切换到其他目录。以下是几种常见的方法:
cd ..
cd ~
或
cd
/home/username
或 /Users/username
)。cd /path/to/directory
cd -
如果是指退出远程终端会话(如 SSH),可以使用:
exit
或按 Ctrl + D
(发送 EOF,结束会话)。
cd ..
cd
或 cd ~
cd /目标路径
cd -
exit
或 Ctrl + D
根据你的需求选择合适的方式即可!
在远程服务器上查看文件目录,可以通过以下方法实现,涵盖基础命令、高级技巧及可视化工具:
ls # 简要列表
ls -l # 详细列表(权限、大小、时间)
ls -la # 包含隐藏文件(以`.`开头)
ls -lh # 文件大小易读格式(KB/MB/GB)
tree # 树状展示(需安装:`sudo apt install tree`)
tree -L 2 # 只显示2层目录
pwd # 显示当前绝对路径
pwd -P # 解析符号链接的真实路径
ssh user@remote_server "ls -l /path/to/directory"
ssh user@remote_server "du -sh /path/to/directory"
-s
:显示总大小-h
:易读单位(KB/MB/GB)View → Tool Windows → Remote Host
ssh user@remote_server "find /path -name '*.log' -type f"
-name
:按文件名匹配-type f
:只找文件(d
为目录)ssh user@remote_server "watch -n 1 'ls -l /path'"
Ctrl+C
退出)。ssh user@remote_server "ls -1 /path | wc -l"
ls
无响应可能原因:目录下文件过多。
解决:限制输出数量:
ls | head -n 50 # 只显示前50个
解决:提权或检查权限:
ssh user@remote_server "sudo ls /root" # 需要sudo权限
ssh user@remote_server "ls -ld /path" # 检查目录权限
区分链接与真实文件:
ls -l # 链接会显示指向路径(如 `lib -> /usr/lib`)
需求 | 命令 |
---|---|
查看目录内容 | ssh user@remote "ls -l /path" |
递归列出所有文件 | ssh user@remote "find /path -type f" |
统计目录大小 | ssh user@remote "du -sh /path" |
实时监控目录 | ssh user@remote "watch -n 1 'ls -l /path'" |
图形化浏览 | 使用 PyCharm/FileZilla/VS Code |
通过以上方法,你可以灵活查看和管理远程服务器的文件目录。推荐组合:
ls -lah
+ tree -L 2
find
+ du
这些是 Linux 系统下通过 ls -l
命令列出的目录详细信息,每个字段都有特定含义。以下是逐项解析:
每行表示一个目录,格式为:
权限 硬链接数 所有者 所属组 大小 最后修改时间 目录名
示例分解:
drwxrwxr-x 5 lyz lyz 4096 4月 6 20:52 Clone-detection-BigCloneBench
drwxrwxr-x
d
:表示这是一个目录(常见类型:-
=文件,l
=符号链接)。rwx
(前3位):所有者(lyz
)的权限rwx
(中3位):所属组(lyz
)的权限r-x
(后3位):其他用户的权限字符 | 权限 | 说明 |
---|---|---|
r |
读(Read) | 可查看目录内容(如 ls ) |
w |
写(Write) | 可创建/删除目录内文件 |
x |
执行(Execute) | 可进入目录(cd ) |
5
.
和 ..
的默认链接)。.
+ 父目录 ..
+ 子目录数)。lyz
lyz
4096
du -sh 目录名
。4月 6 20:52
ls -l --time=ctime
可查看创建时间。Clone-detection-BigCloneBench
)。以 drwxrwxr-x
为例:
rwx
→ 可读、写、进入rwx
→ 同所有者r-x
→ 可读、进入,不可写这是目录元数据的默认占用空间(文件系统的块大小),与实际内容无关。
查看真实大小:
du -sh * # 显示每个目录的总大小
开放所有权限给所有人(慎用):
chmod 777 目录名 # rwxrwxrwx
仅允许所有者读写,其他用户只读:
chmod 755 目录名 # rwxr-xr-x
sudo chown 新所有者:新组 目录名
# 示例:将所有者改为 root
sudo chown root:root Clone-detection-BigCloneBench
命令 | 作用 |
---|---|
stat 目录名 |
查看详细属性(包括 inode、时间戳) |
ls -ld 目录名 |
仅显示目录本身信息(不递归内容) |
getfacl 目录名 |
查看高级权限(ACL) |
通过理解这些信息,你可以快速判断目录的权限归属和状态,便于进行系统管理或问题排查。
在远程服务器上调用或操作文件时,需明确指定文件的远程路径,并通过合适的工具或协议执行。以下是具体方法和注意事项:
ssh user@remote_server "python3 /remote/path/script.py"
/home/user/project/script.py
)。ssh user@remote_server "cat /remote/path/config.json"
# 通过管道将远程文件传递给本地程序
ssh user@remote_server "cat /remote/path/data.txt" | python3 local_processor.py
scp user@remote_server:/remote/path/file.txt ./local_dir/
python3 local_script.py ./local_dir/file.txt
import subprocess
# 通过 SSH 读取远程文件内容
result = subprocess.run(
["ssh", "user@remote_server", "cat", "/remote/path/data.csv"],
capture_output=True, text=True
)
remote_data = result.stdout
# 处理远程数据
print(remote_data.splitlines())
#!/bin/bash
# 调用远程文件并保存到本地临时文件
ssh user@remote_server "cat /remote/path/config.yaml" > /tmp/remote_config.yaml
# 使用本地工具处理
yq eval '.' /tmp/remote_config.yaml
# 同步远程文件到本地临时目录
rsync -avz user@remote_server:/remote/path/ /tmp/remote_files/
# 调用本地副本
python3 /tmp/remote_files/script.py
# 将远程目录挂载到本地(需安装 sshfs)
mkdir -p ~/remote_mount
sshfs user@remote_server:/remote/path ~/remote_mount
# 像本地文件一样操作
python3 ~/remote_mount/script.py
# 卸载
fusermount -u ~/remote_mount
路径问题
远程路径需用绝对路径,避免因工作目录不同导致的错误。
特殊字符(如空格)需转义或加引号:
ssh user@remote "cat '/path/with spaces/file.txt'"
权限控制
确保 SSH 用户对远程文件有读取权限:
ssh user@remote "ls -l /remote/path/file.txt"
如需写入,检查目录的 w
权限。
性能优化
ssh user@remote "cat bigfile.log" | grep "error"
)。安全风险
scp -C
或 rsync -e 'ssh -C'
)。No such file or directory
检查步骤:
确认远程路径存在:
ssh user@remote "ls /remote/path"
检查路径拼写(区分大小写)。
调试方法:
ssh user@remote "whoami && pwd && ls /remote/path"
使用环境变量或参数:
local_var="value"
ssh user@remote "echo $local_var && cat /remote/path/${local_var}_file.txt"
ssh user@remote "command /path/file"
快速执行。很棒的问题!很多人第一次用 SSH、远程服务器或 Conda 时都会卡在“路径到底在哪?”这里,我给你一套通用、高效不踩坑的找路径方法
你想找的东西 | 举例路径 | 如何找 |
---|---|---|
当前所在目录路径 | /home/yourname/project |
pwd |
Conda 安装路径 | /home/yourname/anaconda3 |
which conda 或 conda info |
你要运行的 Python 文件 | /home/yourname/project/run.py |
ls 或 find |
项目/数据文件夹 | /home/yourname/code/my_project |
ls , cd , tree , find |
虚拟环境路径 | /home/yourname/anaconda3/envs/xxx |
conda env list |
pwd
输出类似:
/home/yourname/my_project
这就是你当前所在的绝对路径。
ls -l
列出文件/文件夹详细信息。
run.py
)find ~ -name run.py
解释:
~
:从当前用户目录开始查找-name
:按文件名查找输出例子:
/home/yourname/project1/run.py
which conda
例子:
/home/yourname/anaconda3/bin/conda
说明 Conda 安装在 /home/yourname/anaconda3
。
你可以这样 source:
source ~/anaconda3/etc/profile.d/conda.sh
conda env list
输出:
# conda environments:
#
base /home/yourname/anaconda3
dl-env /home/yourname/anaconda3/envs/dl-env
tree
查看结构(如果安装了)tree -L 2
显示当前目录 2 层结构。
find / -name run.py 2>/dev/null
/
开始查2>/dev/null
是为了不显示“权限不足”的警告需要我帮你写个自动找 run.py + 自动运行 + 自动安装依赖的脚本吗?直接一句话搞定远程部署
这个提示信息的意思是:
⚠️ 你刚安装了一个叫
isympy
的脚本,它被安装到了这个目录:/home/lyz/.local/bin
但是这个目录 没有被加入到系统的 PATH 环境变量中,所以你在终端里直接输入
isympy
命令的时候,系统找不到它,会报:command not found
PATH
是一个环境变量,告诉系统去哪些目录里找可执行程序。
比如你输入:
python
系统会依次去 PATH 中的目录找 python
命令。
如果你安装的程序目录不在 PATH 里,就算它装好了,你也用不了。
/home/lyz/.local/bin
加到 PATH在终端运行:
echo 'export PATH=$PATH:/home/lyz/.local/bin' >> ~/.bashrc
source ~/.bashrc
这样:
export PATH=$PATH:/home/lyz/.local/bin
运行:
echo $PATH
看看有没有 /home/lyz/.local/bin
再试:
which isympy
或者直接运行:
isympy
如果你还遇到找不到 Python 包/命令,或者希望 pip 安装的东西自动能用,也可以告诉我你在用哪个 Python 环境,我可以帮你配置得更顺畅~
谷歌线上gpu跑代码网站名
Hugging Face 是一个专注于自然语言处理(NLP)和机器学习(ML)的开源平 台,提供工具、库和社区资源,帮助开发者快速构建、训练和部署AI模型。以下是其核心功能和特点的详细介绍:
功能:
提供数千种预训练模型(如BERT、GPT、T5),支持PyTorch、TensorFlow和JAX框架。
特点:
AutoModel.from_pretrained("模型名")
示例:
from transformers import pipeline
classifier = pipeline("sentiment-analysis")
classifier("I love Hugging Face!")
huggingface-cli download bert-base-uncased
数据集:
提供超过 4万+个数据集,支持一键加载和预处理。
示例:
from datasets import load_dataset
dataset = load_dataset("glue", "mrpc") # 加载MRPC语义相似度数据集
特性 | 说明 |
---|---|
开源免费 | 核心库(Transformers、Datasets)完全开源,商用友好(Apache 2.0协议) |
跨框架支持 | 同一模型可无缝切换PyTorch/TensorFlow/JAX |
高效推理 | 支持量化(8-bit/4-bit)和ONNX导出,提升推理速度 |
社区驱动 | 开发者可上传模型、数据集,共享使用经验 |
快速原型开发
# 5行代码实现文本摘要
from transformers import pipeline
summarizer = pipeline("summarization")
summarizer("长文本内容...", max_length=130)
微调预训练模型
from transformers import Trainer, TrainingArguments
training_args = TrainingArguments(output_dir="./results", per_device_train_batch_size=8)
trainer = Trainer(model=model, args=training_args, train_dataset=dataset)
trainer.train()
部署生产API
使用 Inference API 直接调用云端模型:
curl https://api-inference.huggingface.co/models/bert-base-uncased \
-X POST -d '{"inputs":"Hello world!"}' \
-H "Authorization: Bearer {API_TOKEN}"
特性 | Hugging Face | Google Colab | OpenAI API |
---|---|---|---|
模型来源 | 社区+官方 | 需自行上传 | 仅OpenAI模型 |
部署便捷性 | 免费Spaces托管 | 需手动部署 | 直接调用API |
自定义训练 | 支持 | 支持 | 不支持 |
成本 | 完全免费(基础功能) | 免费(GPU时间有限) | 按调用次数收费 |
通过Hugging Face,开发者可以跳过繁琐的模型训练和部署流程,直接利用最先进的AI技术构建应用。其开放的生态系统和活跃的社区,使其成为AI领域的“GitHub”。
这个错误表明在通过 huggingface-cli
或 from_pretrained()
下载模型时,网络连接中断,导致文件下载不完整。具体原因是:
核心问题
直接触发点
urllib3.exceptions.IncompleteRead
:HTTP 响应数据未完整接收。requests.exceptions.ChunkedEncodingError
:分块传输编码解码失败。测试网络连接:
ping huggingface.co
如果延迟高或丢包,建议:
import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com" # 国内镜像
# 再运行下载代码
from transformers import AutoModel
model = AutoModel.from_pretrained("bert-base-uncased")
或通过命令行:
HF_ENDPOINT=https://hf-mirror.com huggingface-cli download bert-base-uncased
from transformers import AutoModel
model = AutoModel.from_pretrained("bert-base-uncased", resume_download=True) # 自动恢复中断的下载
通过浏览器下载:
~/.cache/huggingface/hub/
。使用 wget
或 curl
:
wget -c https://huggingface.co/bert-base-uncased/resolve/main/pytorch_model.bin # -c 支持断点续传
from transformers import AutoModel
model = AutoModel.from_pretrained(
"bert-base-uncased",
timeout=60, # 超时时间(秒)
max_retries=5 # 最大重试次数
)
代理问题
如果使用代理,检查代理设置:
echo $http_proxy # 查看是否配置了代理
临时关闭代理:
unset http_proxy https_proxy
磁盘空间不足
检查磁盘剩余空间:
df -h # 查看磁盘使用情况
防火墙限制
下载完成后检查文件大小:
ls -lh ~/.cache/huggingface/hub/models--bert-base-uncased/
# 确认 pytorch_model.bin 文件大小正常(如 440MB)
blobs refs snapshots
输出和config.json pytorch_model.bin tokenizer.json vocab.txt
输出有什么区别在 Hugging Face 模型存储和管理系统中,blobs
、refs
、snapshots
和直接看到的 config.json
、pytorch_model.bin
等文件代表了不同的存储层级和访问方式。以下是它们的核心区别和关联:
blobs
、refs
、snapshots
(Git LFS 内部结构)目录 | 内容 | 用户是否需要直接操作? |
---|---|---|
blobs |
存储文件的实际内容(二进制数据),按哈希值命名(如 sha256:a1b2c3... )。 |
❌ 一般不直接操作 |
refs |
存储指向 blobs 的引用(如分支、标签对应的文件版本)。 |
❌ 一般不直接操作 |
snapshots |
记录不同提交(commit)对应的文件快照,映射到 blobs 中的具体文件。 |
❌ 一般不直接操作 |
git lfs
或 huggingface-cli
下载模型时创建。snapshots
中文件的符号链接或副本。文件 | 作用 | 示例文件大小 |
---|---|---|
config.json |
模型架构配置(如层数、隐藏层维度)。 | 几 KB |
pytorch_model.bin |
PyTorch 模型权重(或 model.safetensors 格式)。 |
几百 MB 到几十 GB |
tokenizer.json |
分词器配置(或 vocab.txt 用于旧模型)。 |
几 KB 到几 MB |
special_tokens_map.json |
特殊标记(如 [CLS] 、[SEP] )的映射关系。 |
几 KB |
from_pretrained()
)直接读取这些文件。config.json
等文件可手动编辑。graph LR
A[Git LFS 内部结构] -->|通过快照映射| B[用户可见文件]
subgraph A
A1[blobs] -->|存储| A2[模型权重二进制]
A3[refs] -->|指向| A1
A4[snapshots] -->|链接| A1
end
subgraph B
B1[config.json]
B2[pytorch_model.bin]
B3[tokenizer.json]
end
blobs/refs/snapshots
?blobs
中是否有大文件)。~/.cache/huggingface/hub/
下的缓存目录。git lfs clone
时会看到这些目录。代码加载模型:
from transformers import AutoModel
model = AutoModel.from_pretrained("./path_to_model") # 读取 config.json/pytorch_model.bin
修改配置:直接编辑 config.json
调整模型参数。
分享模型:打包 config.json
+ pytorch_model.bin
即可。
bert-base-uncased
通过 huggingface-cli
下载:
blobs/refs/snapshots
,但对用户透明。snapshots/
下的符号链接访问文件。直接 git clone
:
blobs
等目录,需运行 git lfs pull
下载真实文件。~/.cache/huggingface/hub/
└── models--bert-base-uncased
├── blobs/ # 二进制文件(哈希命名)
├── refs/ # Git引用
├── snapshots/ # 版本快照
│ └── a1b2c3... # 具体版本
│ ├── config.json # -> ../../blobs/sha256:xx
│ └── pytorch_model.bin # -> ../../blobs/sha256:yy
└── [其他元数据]
特性 | blobs/refs/snapshots |
config.json + pytorch_model.bin |
---|---|---|
定位 | Git LFS 底层管理 | 用户直接使用的文件 |
可见性 | 隐藏(缓存或LFS仓库内) | 显式可见 |
修改方式 | 不推荐手动修改 | 可直接编辑 |
代码加载 | 透明(自动处理) | 显式指定路径加载 |
config.json
等直接可见文件。blobs
等目录。IV blobs
、refs
、snapshots
目录的意思
你看到的 blobs
、refs
、snapshots
目录是 Git LFS(大文件存储) 或 Hugging Face Hub缓存 的标准管理结构,表示当前目录是一个通过 Git LFS 或 Hugging Face 工具管理的文件存储区域。以下是具体解释:
目录名 | 用途 | 是否可手动修改 |
---|---|---|
blobs |
存储实际的文件内容(如模型权重、数据集等),文件以哈希值命名(如 sha256:a1b2c3... )。 |
❌ 不要直接修改 |
refs |
记录指针文件,指向 blobs 中的具体文件版本(类似 Git 的引用系统)。 |
❌ 不要直接修改 |
snapshots |
保存不同版本(commit)的文件快照,每个子目录对应一个版本,内部文件链接到 blobs 。 |
❌ 不要直接修改 |
如果你运行过以下命令:
git clone https://huggingface.co/<模型名> # 模型仓库默认启用 Git LFS
Git LFS 会自动创建这些目录来管理大文件(如 pytorch_model.bin
)。
通过以下方式下载模型时,Hugging Face 库会使用类似结构缓存文件:
from transformers import AutoModel
model = AutoModel.from_pretrained("bert-base-uncased") # 缓存到 ~/.cache/huggingface/hub/
通过 snapshots/
下的符号链接访问最终文件,例如:
ls -l snapshots/a1b2c3d/ # 会看到 config.json、pytorch_model.bin 等文件
这些文件是 blobs
中实际数据的快捷方式。
代码加载:无需直接操作这些目录,用库函数自动处理:
from transformers import AutoModel
model = AutoModel.from_pretrained("./path_to_model") # 自动解析内部结构
手动查看:可通过 tree
命令观察完整结构:
tree -L 3 # 显示3层目录结构
blobs
吗?不建议:会导致文件损坏。若需清理,删除整个仓库或缓存目录:
rm -rf ~/.cache/huggingface/hub/models--bert-base-uncased # Hugging Face 缓存
snapshots
下有多个子目录?每个子目录对应一个模型版本(不同 commit)。通过 revision
参数指定版本:
model = AutoModel.from_pretrained("bert-base-uncased", revision="a1b2c3d")
复制 snapshots
中最新版本的文件即可:
cp -r snapshots/a1b2c3d/* ./model_files/ # 得到可直接使用的文件
snapshots/
下:通过符号链接指向 blobs
中的真实数据。git lfs
或 Hugging Face 工具管理文件。如果需要进一步调试,可以提供你执行的具体命令或代码上下文。
将 Hugging Face 模型从本地缓存(含 blobs/refs/snapshots
结构)迁移到远程服务器时,不建议直接复制这些目录,因其内部结构复杂且依赖符号链接。以下是高效、安全的迁移方案:
huggingface-cli
在远程服务器下载# 在远程服务器执行(需提前安装 huggingface_hub)
pip install huggingface_hub
huggingface-cli download bert-base-uncased --local-dir /remote/path/to/model
--endpoint https://hf-mirror.com
)。from transformers import AutoModel
# 直接下载到远程路径(需有写入权限)
model = AutoModel.from_pretrained("bert-base-uncased", cache_dir="/remote/path/to/cache")
# 定位到模型的 snapshots 最新版本
cd ~/.cache/huggingface/hub/models--bert-base-uncased/snapshots/
latest_commit=$(ls -t | head -1) # 获取最新版本目录
# 打包实际文件(忽略符号链接)
tar -czvf bert-model.tar.gz -C $latest_commit .
生成文件:bert-model.tar.gz
包含:
config.json
pytorch_model.bin
tokenizer.json
vocab.txt
special_tokens_map.json
# 本地压缩文件上传
scp bert-model.tar.gz user@remote:/path/to/model/
# 远程解压
ssh user@remote "tar -xzvf /path/to/model/bert-model.tar.gz -C /path/to/model/"
from transformers import AutoModel
model = AutoModel.from_pretrained("/path/to/model") # 指向解压后的目录
若需完全复制 blobs/refs/snapshots
结构(如维护镜像仓库):
# 本地克隆仓库(含LFS)
git lfs install
git clone https://huggingface.co/bert-base-uncased
# 打包整个仓库(包含.git/lfs)
tar -czvf bert-repo.tar.gz bert-base-uncased/
# 上传到远程并解压
scp bert-repo.tar.gz user@remote:/path/to/
ssh user@remote "tar -xzvf /path/to/bert-repo.tar.gz -C /path/to/"
# 远程拉取LFS文件
ssh user@remote "cd /path/to/bert-base-uncased && git lfs pull"
权限问题:
ssh user@remote "chmod -R 755 /path/to/model"
存储空间:
大模型(如LLaMA-2)可能占用数十GB,检查远程磁盘空间:
ssh user@remote "df -h /path/to/model"
版本一致性:
使用 revision
参数指定版本:
model = AutoModel.from_pretrained("/path/to/model", revision="v1.0")
#!/bin/bash
# 本地打包最新模型
model_name="bert-base-uncased"
cache_dir="$HOME/.cache/huggingface/hub/models--${model_name//-/_}"
snapshot_dir=$(ls -t $cache_dir/snapshots | head -1)
tar -czvf $model_name.tar.gz -C $cache_dir/snapshots/$snapshot_dir .
# 上传并远程加载
remote_path="/remote/models/$model_name"
scp $model_name.tar.gz user@remote:$remote_path/
ssh user@remote "tar -xzvf $remote_path/$model_name.tar.gz -C $remote_path && rm $remote_path/$model_name.tar.gz"
echo "模型已部署到远程路径: $remote_path"
方法 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
远程直接下载 | 服务器可联网 | 自动处理依赖,最省力 | 依赖网络速度 |
手动打包有效文件 | 无外网服务器/需精确控制文件 | 轻量,无冗余文件 | 需手动维护版本 |
完整 Git LFS 同步 | 需要维护完整仓库历史 | 保留所有版本和元数据 | 占用空间大,操作复杂 |
推荐选择:
–
# 安装必要的库
pip install transformers huggingface-hub
# 下载模型到本地目录
python -c "
from transformers import AutoModel, AutoTokenizer
model_name = '模型名称' # 例如 'bert-base-uncased'
model = AutoModel.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
model.save_pretrained('./本地模型目录')
tokenizer.save_pretrained('./本地模型目录')
"
scp -r ./本地模型目录 用户名@远程服务器IP:/远程/目标/路径
rsync -avz --progress ./本地模型目录 用户名@远程服务器IP:/远程/目标/路径
ssh 用户名@远程服务器IP
pip install transformers torch # 或其他模型所需的库
from transformers import AutoModel, AutoTokenizer
model = AutoModel.from_pretrained('/远程/目标/路径/本地模型目录')
tokenizer = AutoTokenizer.from_pretrained('/远程/目标/路径/本地模型目录')
print("模型加载成功!")
模型大小:大型模型可能需要很长时间传输,考虑压缩后传输
tar -czvf model.tar.gz ./本地模型目录
scp model.tar.gz 用户名@远程服务器IP:/远程/目标/路径
# 在远程服务器上解压
tar -xzvf /远程/目标/路径/model.tar.gz -C /远程/目标/路径
权限问题:确保远程服务器有足够的存储空间和写入权限
环境一致性:保持本地和远程的Python环境、库版本一致
网络稳定性:大文件传输建议使用稳定的网络连接
如果服务器可以访问外部网络,更简单的方法是直接在远程服务器上下载:
ssh 用户名@远程服务器IP
git lfs install # 如果使用git lfs
git clone https://huggingface.co/模型名称
# 或者使用transformers库直接下载
python -c "
from transformers import AutoModel
AutoModel.from_pretrained('模型名称').save_pretrained('./模型目录')
"
Question:
如果某个/target/path/不存在对应的目录,程序是否会帮忙创建?
不会
解释如下
在大多数情况下,程序不会自动创建不存在的目录,需要你手动提前创建或通过命令参数显式指定自动创建。以下是不同场景下的具体行为和处理方法:
huggingface-cli download
默认行为:如果目标目录不存在,会报错(FileNotFoundError
)。
解决方案:添加 --create-dir
参数(部分版本支持)或手动创建:
# 方法1:手动创建目录
ssh user@remote_server "mkdir -p /remote/path/to/model"
# 方法2:使用支持自动创建的版本
huggingface-cli download bert-base-uncased --local-dir /remote/path/to/model --create-dir
from_pretrained()
代码加载缓存目录:如果 cache_dir
路径不存在,会自动创建(需有写入权限)。
# 会自动创建 /new/cache/path/ 目录
model = AutoModel.from_pretrained("bert-base-uncased", cache_dir="/new/cache/path")
自定义模型路径:直接加载本地目录时,路径必须已存在:
# 会报错,除非 /nonexistent/path/ 已存在
model = AutoModel.from_pretrained("/nonexistent/path")
scp
/rsync
不会创建目录:目标路径的父目录必须存在。
# 会失败,因为 /remote/path/to/ 不存在
scp model.tar.gz user@remote_server:/remote/path/to/model/
# 正确做法:先创建目录
ssh user@remote_server "mkdir -p /remote/path/to/model"
scp model.tar.gz user@remote_server:/remote/path/to/model/
tar
解压需要 -C
目标目录存在:
# 必须先创建 /remote/path/to/model/
ssh user@remote_server "mkdir -p /remote/path/to/model && tar -xzvf model.tar.gz -C /remote/path/to/model"
# 上传前确保远程目录存在
ssh user@remote_server "mkdir -p /remote/path/to/model"
# 再传输文件
scp model.tar.gz user@remote_server:/remote/path/to/model/
# 解压时明确指定目录
ssh user@remote_server "tar -xzvf /remote/path/to/model/model.tar.gz -C /remote/path/to/model"
#!/bin/bash
REMOTE_PATH="/remote/path/to/model" # 替换为你的实际路径
REMOTE_USER="user"
REMOTE_HOST="example.com"
# 确保远程目录存在
ssh $REMOTE_USER@$REMOTE_HOST "mkdir -p $REMOTE_PATH"
# 传输并解压
scp model.tar.gz $REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/
ssh $REMOTE_USER@$REMOTE_HOST "tar -xzvf $REMOTE_PATH/model.tar.gz -C $REMOTE_PATH"
如果无法在目标位置(如 /opt
)创建目录:
# 尝试用户主目录
REMOTE_PATH="$HOME/projects/models"
# 或联系管理员获取权限
ssh user@remote_server "sudo mkdir -p /opt/models && sudo chown $USER /opt/models"
mkdir -p
会自动创建所有父级目录:
# 一次性创建 /data/models/bert/2024/
ssh user@remote_server "mkdir -p /data/models/bert/2024"
工具/场景 | 是否自动创建目录 | 解决方案 |
---|---|---|
huggingface-cli download |
❌ 否 | 手动创建或加 --create-dir |
from_pretrained(cache_dir) |
✅ 是 | 确保父目录有写入权限 |
from_pretrained(本地路径) |
❌ 否 | 路径必须已存在 |
scp /rsync |
❌ 否 | 提前用 mkdir -p 创建 |
tar 解压 |
❌ 否 | -C 目标目录必须存在 |
黄金法则:在传输文件前,始终先用 mkdir -p
确保远程目录存在!
在 SSH 终端中查看当前目录下的所有直接子目录(即根目录,非递归显示),可以使用以下命令:
ls -d */
效果:仅显示当前目录下的子目录(以 /
结尾),忽略文件。
示例输出:
bin/ data/ etc/ models/ tmp/
ls -ld */
效果:显示目录的详细属性(类似 ll
)。
示例输出:
drwxr-xr-x 2 user group 4096 Jun 10 10:00 bin/
drwxr-xr-x 5 user group 4096 Jun 11 15:00 data/
/
后缀)ls -d */ | sed 's|/$||'
或使用 find
:
find . -maxdepth 1 -type d ! -name "." | sed 's|^\./||'
示例输出:
bin
data
models
如果想同时查看目录和文件,但明确区分目录:
ls -F | grep '/$'
-F
参数:在目录后添加 /
,可执行文件后添加 *
。grep '/$'
:筛选出目录。ls -d */ | wc -l
隐藏目录:上述命令默认不显示以 .
开头的隐藏目录。若需包含隐藏目录:
ls -d .*/ */ | grep -v '^\.\./$' # 排除父目录链接
符号链接目录:
ls -d */
会包含符号链接目录。若需排除:
ls -l | grep '^d' | awk '{print $9}' # 仅真实目录
远程目录权限:
如果某些目录无读取权限,会显示错误。可忽略错误:
ls -d */ 2>/dev/null
# 登录远程服务器后执行
ssh user@remote_server "cd /target/path && ls -d */"
需求 | 命令 | 输出示例 |
---|---|---|
快速查看子目录 | ls -d */ |
bin/ data/ |
显示目录详情 | ls -ld */ |
权限、大小等详细信息 |
仅显示目录名(无 / ) |
`ls -d */ | sed 's |
包含隐藏目录 | ls -d .*/ */ |
.config/ bin/ |
( tokenizer.json
)
以下是分步解决方案,用于下载缺失的 tokenizer.json
并传输到远程服务器的指定位置:
huggingface-cli
下载(推荐)# 安装工具(如果未安装)
pip install huggingface_hub
# 下载指定模型的分词器文件到本地目录
huggingface-cli download bert-base-uncased \
--filename tokenizer.json \
--filename tokenizer_config.json \
--filename vocab.txt \
--local-dir ./tokenizer_files
效果:会在 ./tokenizer_files
下生成所需文件:
tokenizer.json
tokenizer_config.json
vocab.txt
from huggingface_hub import snapshot_download
# 下载分词器相关文件
snapshot_download(
repo_id="bert-base-uncased",
allow_patterns=["tokenizer*.json", "vocab.txt"],
local_dir="./tokenizer_files"
)
tar -czvf tokenizer_files.tar.gz -C ./tokenizer_files .
scp tokenizer_files.tar.gz user@remote_server:/target/model/path/
user@remote_server
:远程服务器的用户名和地址/target/model/path/
:远程模型目录(需替换为实际路径)ssh user@remote_server
# 进入目标目录
cd /target/model/path/
# 解压(保留原文件结构)
tar -xzvf tokenizer_files.tar.gz
# 删除压缩包(可选)
rm tokenizer_files.tar.gz
ls -lh /target/model/path/
应看到新增文件:
tokenizer.json
tokenizer_config.json
vocab.txt
在远程服务器上运行 Python 测试:
from transformers import AutoTokenizer
# 加载修复后的分词器
tokenizer = AutoTokenizer.from_pretrained("/target/model/path/")
print(tokenizer("Hello world!")) # 测试编码
路径一致性:
/target/model/path/
是原模型目录,且其他文件(如 config.json
)已存在。权限问题:
远程目录需有写入权限:
ssh user@remote_server "chmod -R 755 /target/model/path/"
模型匹配:
bert-base-uncased
的分词器不能用于 gpt2
)。网络加速:
国内服务器下载时可添加镜像参数:
huggingface-cli download --endpoint https://hf-mirror.com ...
#!/bin/bash
# 本地下载并传输分词器文件
MODEL_NAME="bert-base-uncased"
REMOTE_USER="user"
REMOTE_HOST="example.com"
REMOTE_PATH="/remote/models/bert"
# 1. 下载文件
mkdir -p ./tokenizer_tmp
huggingface-cli download $MODEL_NAME \
--filename tokenizer.json \
--filename tokenizer_config.json \
--filename vocab.txt \
--local-dir ./tokenizer_tmp
# 2. 打包传输
tar -czvf tokenizer_files.tar.gz -C ./tokenizer_tmp .
scp tokenizer_files.tar.gz $REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/
rm -rf ./tokenizer_tmp tokenizer_files.tar.gz
# 3. 远程解压
ssh $REMOTE_USER@$REMOTE_HOST "
cd $REMOTE_PATH && \
tar -xzvf tokenizer_files.tar.gz && \
rm tokenizer_files.tar.gz
"
echo "分词器文件已部署到: $REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH"
这个命令使用 Hugging Face 官方命令行工具 huggingface-cli
从模型仓库中选择性下载特定文件到本地目录。以下是逐部分解析:
huggingface-cli download bert-base-uncased \
--filename tokenizer.json \
--filename tokenizer_config.json \
--filename vocab.txt \
--local-dir ./tokenizer_files
部分 | 作用 |
---|---|
huggingface-cli download |
调用 Hugging Face 的下载功能 |
bert-base-uncased |
指定要下载的模型名称(对应 Hugging Face Hub 上的仓库) |
--filename tokenizer.json |
精确指定需要下载的文件名(可多次使用) |
--local-dir ./tokenizer_files |
设置文件保存的本地目录(会自动创建) |
目录结构
命令会在当前路径下创建 ./tokenizer_files/
目录,并包含以下文件:
./tokenizer_files/
├── tokenizer.json # 分词器主配置(词汇表、特殊标记等)
├── tokenizer_config.json # 分词器类型和参数(如大写处理、截断设置)
└── vocab.txt # 词汇表(BERT等传统模型使用)
文件来源
这些文件从 bert-base-uncased 模型仓库 下载,但仅下载指定的文件,而非完整模型。
文件 | 用途 | 必需性 |
---|---|---|
tokenizer.json |
包含分词器的完整配置(BPE/WordPiece 等算法、特殊标记、预处理规则) | 现代分词器通常需要 |
tokenizer_config.json |
定义分词器类(如 BertTokenizerFast )和基础参数 |
推荐有,但可自动推断 |
vocab.txt |
传统模型(如BERT)的词汇表,每行一个词 | 若无 tokenizer.json 则必需 |
tokenizer.json
怎么办?旧版模型可能只有 vocab.txt
+ tokenizer_config.json
,此时只需下载这两个文件:
huggingface-cli download bert-base-uncased \
--filename tokenizer_config.json \
--filename vocab.txt \
--local-dir ./tokenizer_files
使用通配符:
huggingface-cli download bert-base-uncased \
--filename "tokenizer*" \
--filename "vocab*" \
--local-dir ./tokenizer_files
使用镜像站点:
HF_ENDPOINT=https://hf-mirror.com huggingface-cli download bert-base-uncased \
--filename tokenizer.json \
--local-dir ./tokenizer_files
huggingface-cli download bert-base-uncased \
--revision v1.0.0 \ # 指定git标签或commit hash
--filename tokenizer.json \
--local-dir ./tokenizer_files
huggingface-cli download bert-base-uncased \
--filename tokenizer.json \
--local-dir ./tokenizer_files \
--force-filename # 若文件已存在则跳过
huggingface-cli download bert-base-uncased \
--filename tokenizer.json \
--filename tokenizer_config.json \
--local-dir ./tokenizer_files
ls -lh ./tokenizer_files/
# 应输出:
# -rw-r--r-- 1 user group 1.2M Jun 1 10:00 tokenizer.json
# -rw-r--r-- 1 user group 2.1K Jun 1 10:00 tokenizer_config.json
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("./tokenizer_files")
print(tokenizer("Hello world!"))
# 输出应类似:{'input_ids': [101, 7592, 2088, 102], 'attention_mask': [1, 1, 1, 1]}
通过此命令,你可以高效地补全远程服务器缺失的分词器文件,而无需下载整个模型。