SSH入坑与ssh终端模型导入
本文是作者初次使用ssh终端时个人经验总结和坑点汇总,作者通过搜索各方资料得来的经验,同时还包含了ssh使用过程中的难点与痛点,如果有错误,还望大家多多包涵,费心之处,感谢大家支持
SSH使用与模型导入ssh终端
一、进入子目录
在 Linux 或 macOS 的终端中,进入子目录主要通过 cd(change directory)命令实现。以下是具体方法和常见场景的详细说明:
1. 基础命令
登陆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
2. 特殊路径技巧
进入用户主目录
cd ~
# 或简写为
cd
进入根目录
cd /
进入上次所在的目录
cd -
3. 路径补全功能
输入目录名的前几个字母后按 Tab 键自动补全(避免输错):
cd pro<Tab> # 自动补全为 cd projects/
4. 常见问题解决
问题1:目录名称有空格
用引号包裹或使用反斜杠转义:
cd "my project"
# 或
cd my\ project
问题2:权限不足
若目录需要权限,先用 ls -l 检查权限:
drwxr-x--- 2 root root 4096 Jun 5 10:00 admin_dir
需切换用户或提权:
sudo su # 切换为 root
cd admin_dir
问题3:目录不存在
先用 ls 确认子目录名称是否正确:
ls # 查看当前目录内容
cd subdir # 确保 subdir 存在
5. 结合其他命令的实用技巧
创建并立即进入新目录
mkdir -p new_folder && cd new_folder
查找并进入目录
# 找到名为 src 的目录路径(需安装 find 命令)
cd $(find ~ -type d -name "src" 2>/dev/null | head -1)
6. 在 PyCharm 终端中的操作
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对应文件与当前文件相对应
在通过 SSH 操作远程服务器时,将本地文件与远程服务器的当前目录对应起来,通常需要 文件同步 或 路径映射。以下是几种常见方法,确保你在本地和远程之间高效、准确地管理文件:
1. 使用 scp 或 rsync 同步文件
(1) 从本地复制到远程当前目录
# 语法:scp [本地文件] [用户@远程主机:远程路径]
scp ./local_file.txt user@remote_server:~/ # 复制到远程家目录
scp ./local_file.txt user@remote_server:"$(pwd)" # 复制到远程当前目录
pwd会解析为远程的当前路径(需确保远程当前目录存在)。
(2) 从远程复制到本地当前目录
# 语法:scp [用户@远程主机:远程文件] [本地路径]
scp user@remote_server:~/remote_file.txt ./
scp user@remote_server:"$(ssh user@remote_server 'pwd')/remote_file.txt" ./
(3) 使用 rsync(更高效,支持增量同步)
rsync -avz ./local_file.txt user@remote_server:"$(ssh user@remote_server 'pwd')"
2. 通过 SSH 直接操作远程文件
(1) 在本地编辑远程文件(使用 vim/nano over SSH)
ssh user@remote_server "nano $(pwd)/remote_file.txt"
(2) 检查远程当前目录的文件
ssh user@remote_server "ls -l $(pwd)"
3. 自动化路径映射(脚本示例)
(1) 获取远程当前目录并同步
#!/bin/bash
REMOTE_DIR=$(ssh user@remote_server 'pwd') # 获取远程当前目录
scp ./local_file.txt user@remote_server:"$REMOTE_DIR"
echo "文件已同步到远程路径: $REMOTE_DIR"
(2) 本地与远程目录实时同步(需 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
4. 使用 PyCharm 专业版的远程开发功能
-
配置远程解释器:
File → Settings → Python Interpreter → Add → SSH Interpreter- 设置远程主机的路径映射(本地和远程目录自动关联)。
-
手动同步文件:
- 右键文件 →
Deployment → Upload(上传到远程对应路径)。
- 右键文件 →
5. 注意事项
-
路径一致性:
- 确保本地和远程的目录结构一致(例如本地
./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 两种常用工具为例,提供详细步骤和注意事项:
方法1:使用 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/ user@192.168.1.100:/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/
方法2:使用 scp(简单但效率较低)
命令格式
scp -r ./local_folder user@remote_server:/path/to/remote/directory/
参数说明
| 参数 | 作用 |
|---|---|
-r |
递归复制整个目录 |
示例
# 将当前目录下的 `project` 文件夹复制到远程的 `/home/user/backup/`
scp -r ./project user@192.168.1.100:/home/user/backup/
注意事项
scp会全量传输文件,不适合大文件夹或频繁同步。- 传输中断后需重新开始,不支持断点续传。
方法3:通过 SSH + Tar(适合高压缩需求)
命令格式
tar czf - ./local_folder | ssh user@remote_server "tar xzf - -C /path/to/remote/directory"
参数说明
| 命令部分 | 作用 |
|---|---|
tar czf - |
将本地文件夹压缩为流(不生成临时文件) |
tar xzf - -C |
在远程解压到指定目录 |
示例
# 压缩传输当前目录到远程的 `/backup/`
tar czf - ./ | ssh user@192.168.1.100 "tar xzf - -C /backup/"
适用场景
- 需要高压缩比(如网络带宽有限)。
- 文件夹包含大量小文件时效率较高。
常见问题解决
1. 权限不足
-
问题:
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"
-
2. 网络中断
rsync:重新执行命令会自动续传。scp:需完全重新传输。
3. 符号链接处理
-
默认情况下,
rsync会同步符号链接本身。如需跟随链接(复制实际文件),加-L:rsync -avzL ./project/ user@remote_server:/backup/
总结建议
| 场景 | 推荐工具 | 优点 |
|---|---|---|
| 首次同步大文件夹 | rsync |
支持断点续传、进度显示 |
| 简单快速复制小文件夹 | scp |
命令简单直观 |
| 需要高压缩比 | tar + ssh |
节省带宽,适合慢速网络 |
最终推荐命令(平衡效率和易用性):
rsync -avz --progress ./local_folder/ user@remote_server:/remote/path/
执行后输入远程服务器密码(或配置 SSH 密钥免密登录),即可完成同步。
四、退出远程终端当前目录
在远程终端中,退出当前目录通常是指返回到上一级目录或切换到其他目录。以下是几种常见的方法:
1. 返回上一级目录
cd ..
- 这会退出当前目录,返回到父目录。
2. 直接切换到主目录(家目录)
cd ~
或
cd
- 这会直接回到你的用户主目录(如
/home/username或/Users/username)。
3. 切换到指定目录
cd /path/to/directory
- 直接跳转到目标路径。
4. 返回之前的目录(切换回上一个工作目录)
cd -
- 这会返回到你上一次所在的目录。
5. 退出远程终端(断开连接)
如果是指退出远程终端会话(如 SSH),可以使用:
exit
或按 Ctrl + D(发送 EOF,结束会话)。
总结:
- 退出当前目录并返回上级:
cd .. - 直接回家目录:
cd或cd ~ - 切换目录:
cd /目标路径 - 返回上一个目录:
cd - - 完全退出远程终端:
exit或Ctrl + D
根据你的需求选择合适的方式即可!
五、查看远程终端目录
在远程服务器上查看文件目录,可以通过以下方法实现,涵盖基础命令、高级技巧及可视化工具:
1. 基础命令(SSH 连接后使用)
(1) 查看当前目录内容
ls # 简要列表
ls -l # 详细列表(权限、大小、时间)
ls -la # 包含隐藏文件(以`.`开头)
ls -lh # 文件大小易读格式(KB/MB/GB)
(2) 查看目录结构
tree # 树状展示(需安装:`sudo apt install tree`)
tree -L 2 # 只显示2层目录
(3) 查看当前路径
pwd # 显示当前绝对路径
pwd -P # 解析符号链接的真实路径
2. 直接通过 SSH 执行命令(无需登录)
(1) 单次查看远程目录
ssh user@remote_server "ls -l /path/to/directory"
(2) 递归统计目录大小
ssh user@remote_server "du -sh /path/to/directory"
-s:显示总大小-h:易读单位(KB/MB/GB)
3. 使用图形化工具
(1) PyCharm 内置工具
- 打开远程主机窗口
View → Tool Windows → Remote Host - 浏览文件树,支持右键操作(上传/下载/编辑)。
(2) FileZilla(SFTP 客户端)
- 连接协议选择 SFTP,输入 SSH 凭据。
- 直接拖拽文件进行管理。
(3) VS Code 远程插件
- 安装 Remote - SSH 扩展。
- 连接后通过资源管理器浏览文件。
4. 高级技巧
(1) 查找文件
ssh user@remote_server "find /path -name '*.log' -type f"
-name:按文件名匹配-type f:只找文件(d为目录)
(2) 实时监控目录变化
ssh user@remote_server "watch -n 1 'ls -l /path'"
- 每1秒刷新一次目录内容(按
Ctrl+C退出)。
(3) 统计文件数量
ssh user@remote_server "ls -1 /path | wc -l"
5. 常见问题解决
问题1:ls 无响应
-
可能原因:目录下文件过多。
-
解决:限制输出数量:
ls | head -n 50 # 只显示前50个
问题2:权限不足
-
解决:提权或检查权限:
ssh user@remote_server "sudo ls /root" # 需要sudo权限 ssh user@remote_server "ls -ld /path" # 检查目录权限
问题3:符号链接显示
-
区分链接与真实文件:
ls -l # 链接会显示指向路径(如 `lib -> /usr/lib`)
6. 快速命令参考表
| 需求 | 命令 |
|---|---|
| 查看目录内容 | 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 - 可视化操作:PyCharm/VS Code 远程插件
六、ls -l查看远程目录名解析
这些是 Linux 系统下通过 ls -l 命令列出的目录详细信息,每个字段都有特定含义。以下是逐项解析:
1. 整体格式说明
每行表示一个目录,格式为:权限 硬链接数 所有者 所属组 大小 最后修改时间 目录名
示例分解:drwxrwxr-x 5 lyz lyz 4096 4月 6 20:52 Clone-detection-BigCloneBench
2. 各字段详细解释
(1) 文件类型与权限 drwxrwxr-x
- 首字母
d:表示这是一个目录(常见类型:-=文件,l=符号链接)。 - 后续 9 个字符:分 3 组,分别对应不同用户的权限:
rwx(前3位):所有者(lyz)的权限rwx(中3位):所属组(lyz)的权限r-x(后3位):其他用户的权限
| 字符 | 权限 | 说明 |
|---|---|---|
r |
读(Read) | 可查看目录内容(如 ls) |
w |
写(Write) | 可创建/删除目录内文件 |
x |
执行(Execute) | 可进入目录(cd) |
(2) 硬链接数 5
- 表示该目录被引用的次数(包含
.和..的默认链接)。 - 通常目录的硬链接数 ≥ 2(自身
.+ 父目录..+ 子目录数)。
(3) 所有者 lyz
- 目录的创建者/所有者,拥有最高权限(可修改权限或删除)。
(4) 所属组 lyz
- 目录所属的用户组,组内成员共享权限。
(5) 大小 4096
- 目录本身占用的磁盘空间(单位:字节)。
- 注意:此值不包含目录内文件的总大小,仅目录元数据。
- 查看目录实际大小需用
du -sh 目录名。
(6) 最后修改时间 4月 6 20:52
- 目录内容最后一次被修改的时间(如增删文件)。
- 使用
ls -l --time=ctime可查看创建时间。
(7) 目录名
- 目录的名称(如
Clone-detection-BigCloneBench)。
3. 权限示例解析
以 drwxrwxr-x 为例:
- 所有者(lyz):
rwx→ 可读、写、进入 - 所属组(lyz组):
rwx→ 同所有者 - 其他用户:
r-x→ 可读、进入,不可写
4. 常见问题
Q1: 为什么所有目录大小都是 4096 字节?
-
这是目录元数据的默认占用空间(文件系统的块大小),与实际内容无关。
-
查看真实大小:
du -sh * # 显示每个目录的总大小
Q2: 如何修改权限?
-
开放所有权限给所有人(慎用):
chmod 777 目录名 # rwxrwxrwx -
仅允许所有者读写,其他用户只读:
chmod 755 目录名 # rwxr-xr-x
Q3: 如何修改所有者?
sudo chown 新所有者:新组 目录名
# 示例:将所有者改为 root
sudo chown root:root Clone-detection-BigCloneBench
5. 扩展命令
| 命令 | 作用 |
|---|---|
stat 目录名 |
查看详细属性(包括 inode、时间戳) |
ls -ld 目录名 |
仅显示目录本身信息(不递归内容) |
getfacl 目录名 |
查看高级权限(ACL) |
通过理解这些信息,你可以快速判断目录的权限归属和状态,便于进行系统管理或问题排查。
七、调用远程目录下的文件
在远程服务器上调用或操作文件时,需明确指定文件的远程路径,并通过合适的工具或协议执行。以下是具体方法和注意事项:
1. 通过 SSH 直接调用远程文件
(1) 执行远程脚本
ssh user@remote_server "python3 /remote/path/script.py"
- 路径格式:必须使用远程服务器上的绝对路径(如
/home/user/project/script.py)。 - 环境依赖:确保远程服务器已安装所需解释器(如 Python、Bash)。
(2) 调用远程文件内容
ssh user@remote_server "cat /remote/path/config.json"
2. 在本地与远程文件交互
(1) 本地调用远程文件(不下载)
# 通过管道将远程文件传递给本地程序
ssh user@remote_server "cat /remote/path/data.txt" | python3 local_processor.py
(2) 下载远程文件到本地处理
scp user@remote_server:/remote/path/file.txt ./local_dir/
python3 local_script.py ./local_dir/file.txt
3. 在脚本中动态引用远程文件
(1) Python 示例
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())
(2) Shell 脚本示例
#!/bin/bash
# 调用远程文件并保存到本地临时文件
ssh user@remote_server "cat /remote/path/config.yaml" > /tmp/remote_config.yaml
# 使用本地工具处理
yq eval '.' /tmp/remote_config.yaml
4. 使用高级工具管理远程文件
(1) rsync 同步后操作
# 同步远程文件到本地临时目录
rsync -avz user@remote_server:/remote/path/ /tmp/remote_files/
# 调用本地副本
python3 /tmp/remote_files/script.py
(2) SSHFS 挂载远程目录
# 将远程目录挂载到本地(需安装 sshfs)
mkdir -p ~/remote_mount
sshfs user@remote_server:/remote/path ~/remote_mount
# 像本地文件一样操作
python3 ~/remote_mount/script.py
# 卸载
fusermount -u ~/remote_mount
5. 注意事项
-
路径问题
-
远程路径需用绝对路径,避免因工作目录不同导致的错误。
-
特殊字符(如空格)需转义或加引号:
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")。
- 大文件建议先下载或使用流式处理(如
-
安全风险
- 避免在命令中硬编码密码,使用 SSH 密钥认证。
- 敏感文件传输时启用加密(如
scp -C或rsync -e 'ssh -C')。
6. 常见问题解决
Q:报错 No such file or directory
-
检查步骤:
-
确认远程路径存在:
ssh user@remote "ls /remote/path" -
检查路径拼写(区分大小写)。
-
Q:远程命令执行失败
-
调试方法:
ssh user@remote "whoami && pwd && ls /remote/path"
Q:如何传递变量到远程命令?
-
使用环境变量或参数:
local_var="value" ssh user@remote "echo $local_var && cat /remote/path/${local_var}_file.txt"
总结
- 直接调用:通过
ssh user@remote "command /path/file"快速执行。 - 复杂操作:建议先同步到本地或挂载远程目录。
- 生产环境:推荐使用配置管理工具(如 Ansible)或分布式文件系统(如 NFS)。
八、如何找路径?
很棒的问题!很多人第一次用 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 |
✅ 二、实操:快速找路径的命令
📌 1. 查看你当前在哪个路径
pwd
输出类似:
/home/yourname/my_project
这就是你当前所在的绝对路径。
📌 2. 看当前目录里有什么
ls -l
列出文件/文件夹详细信息。
📌 3. 找某个文件名(比如 run.py)
find ~ -name run.py
解释:
~:从当前用户目录开始查找-name:按文件名查找
输出例子:
/home/yourname/project1/run.py
📌 4. 找 conda 的路径
which conda
例子:
/home/yourname/anaconda3/bin/conda
说明 Conda 安装在 /home/yourname/anaconda3。
你可以这样 source:
source ~/anaconda3/etc/profile.d/conda.sh
📌 5. 找 Conda 环境路径
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?
PATH 是一个环境变量,告诉系统去哪些目录里找可执行程序。
比如你输入:
python
系统会依次去 PATH 中的目录找 python 命令。
如果你安装的程序目录不在 PATH 里,就算它装好了,你也用不了。
🔧 解决方法:把 /home/lyz/.local/bin 加到 PATH
✅ 一次性解决(推荐)
在终端运行:
echo 'export PATH=$PATH:/home/lyz/.local/bin' >> ~/.bashrc
source ~/.bashrc
这样:
- 会把这个路径加入 PATH
- 每次登录都自动生效 ✅
🔄 或者临时添加(仅当前终端有效):
export PATH=$PATH:/home/lyz/.local/bin
🔍 验证是否成功
运行:
echo $PATH
看看有没有 /home/lyz/.local/bin
再试:
which isympy
或者直接运行:
isympy
如果你还遇到找不到 Python 包/命令,或者希望 pip 安装的东西自动能用,也可以告诉我你在用哪个 Python 环境,我可以帮你配置得更顺畅~
十、google colab
谷歌线上gpu跑代码网站名
十一、下载大模型
I hugging face介绍
Hugging Face 是一个专注于自然语言处理(NLP)和机器学习(ML)的开源平 台,提供工具、库和社区资源,帮助开发者快速构建、训练和部署AI模型。以下是其核心功能和特点的详细介绍:
1. 核心产品与服务
(1) Transformers 库
-
功能:
提供数千种预训练模型(如BERT、GPT、T5),支持PyTorch、TensorFlow和JAX框架。 -
特点:
- 一键加载模型:
AutoModel.from_pretrained("模型名") - 支持文本分类、翻译、生成等任务。
- 一键加载模型:
-
示例:
from transformers import pipeline classifier = pipeline("sentiment-analysis") classifier("I love Hugging Face!")
(2) Model Hub(模型库)
- 资源:
- 开放社区上传的 50万+个模型,涵盖NLP、计算机视觉、音频等领域。
- 包括Meta、Google等机构发布的官方模型(如Llama 2、Whisper)。
- 使用:
- 直接下载模型:
huggingface-cli download bert-base-uncased - 在线体验:通过网页界面测试模型(如 ChatGPT 风格演示)。
- 直接下载模型:
(3) Datasets 库
-
数据集:
提供超过 4万+个数据集,支持一键加载和预处理。 -
示例:
from datasets import load_dataset dataset = load_dataset("glue", "mrpc") # 加载MRPC语义相似度数据集
(4) Spaces(应用托管)
2. 技术优势
| 特性 | 说明 |
|---|---|
| 开源免费 | 核心库(Transformers、Datasets)完全开源,商用友好(Apache 2.0协议) |
| 跨框架支持 | 同一模型可无缝切换PyTorch/TensorFlow/JAX |
| 高效推理 | 支持量化(8-bit/4-bit)和ONNX导出,提升推理速度 |
| 社区驱动 | 开发者可上传模型、数据集,共享使用经验 |
3. 典型应用场景
-
快速原型开发
# 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}"
-
4. 与其他平台的对比
| 特性 | Hugging Face | Google Colab | OpenAI API |
|---|---|---|---|
| 模型来源 | 社区+官方 | 需自行上传 | 仅OpenAI模型 |
| 部署便捷性 | 免费Spaces托管 | 需手动部署 | 直接调用API |
| 自定义训练 | 支持 | 支持 | 不支持 |
| 成本 | 完全免费(基础功能) | 免费(GPU时间有限) | 按调用次数收费 |
5. 学习资源
- 官方文档:
- Transformers 教程
- 课程(免费中文版)
- 实践项目:
- 克隆现成Space:GPT-2聊天机器人
- 微调指南:Fine-tune BERT
6. 企业服务
- Hugging Face Hub Pro:
私有模型托管、团队协作功能($9/用户/月)。 - Inference Endpoints:
专有云托管,低延迟推理(按需计费)。 - 定制支持:
为企业提供模型优化和部署咨询服务。
通过Hugging Face,开发者可以跳过繁琐的模型训练和部署流程,直接利用最先进的AI技术构建应用。其开放的生态系统和活跃的社区,使其成为AI领域的“GitHub”。
II下载错误分析
这个错误表明在通过 huggingface-cli 或 from_pretrained() 下载模型时,网络连接中断,导致文件下载不完整。具体原因是:
错误原因分析
-
核心问题
- 下载大模型文件时(此处尝试下载约 519MB 的文件),网络连接不稳定或被中断。
- 错误信息显示:已下载 14.5MB,但剩余 519MB 未完成。
-
直接触发点
urllib3.exceptions.IncompleteRead:HTTP 响应数据未完整接收。requests.exceptions.ChunkedEncodingError:分块传输编码解码失败。
解决方案
1. 检查网络稳定性
-
测试网络连接:
ping huggingface.co -
如果延迟高或丢包,建议:
- 使用更稳定的网络(如有线连接代替WiFi)。
- 避开网络高峰时段。
2. 使用国内镜像源(推荐)
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
3. 启用断点续传
from transformers import AutoModel
model = AutoModel.from_pretrained("bert-base-uncased", resume_download=True) # 自动恢复中断的下载
4. 手动下载模型文件
-
通过浏览器下载:
- 访问 Hugging Face 模型页面,手动下载文件到
~/.cache/huggingface/hub/。
- 访问 Hugging Face 模型页面,手动下载文件到
-
使用
wget或curl:wget -c https://huggingface.co/bert-base-uncased/resolve/main/pytorch_model.bin # -c 支持断点续传
5. 调整超时和重试设置
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 # 查看磁盘使用情况
-
-
防火墙限制
- 确保未屏蔽 Hugging Face 的域名或端口(默认 HTTPS 443)。
验证下载完整性
下载完成后检查文件大小:
ls -lh ~/.cache/huggingface/hub/models--bert-base-uncased/
# 确认 pytorch_model.bin 文件大小正常(如 440MB)
总结
- 优先尝试:切换国内镜像源 + 启用断点续传。
- 网络问题:确保连接稳定,或手动下载文件。
- 长期方案:配置更可靠的网络环境或使用离线模式。
III blobs refs snapshots输出和config.json pytorch_model.bin tokenizer.json vocab.txt输出有什么区别
在 Hugging Face 模型存储和管理系统中,blobs、refs、snapshots 和直接看到的 config.json、pytorch_model.bin 等文件代表了不同的存储层级和访问方式。以下是它们的核心区别和关联:
1. blobs、refs、snapshots(Git LFS 内部结构)
用途
- Git LFS(大文件存储) 的底层管理结构,用于高效管理大模型文件。
- 这些目录是 Hugging Face Hub 缓存 或 直接克隆模型仓库(含 LFS) 时自动生成的。
具体内容
| 目录 | 内容 | 用户是否需要直接操作? |
|---|---|---|
blobs |
存储文件的实际内容(二进制数据),按哈希值命名(如 sha256:a1b2c3...)。 |
❌ 一般不直接操作 |
refs |
存储指向 blobs 的引用(如分支、标签对应的文件版本)。 |
❌ 一般不直接操作 |
snapshots |
记录不同提交(commit)对应的文件快照,映射到 blobs 中的具体文件。 |
❌ 一般不直接操作 |
特点
- 自动生成:通过
git lfs或huggingface-cli下载模型时创建。 - 隐藏细节:用户通常无需关心这些目录,它们是 Git LFS 的实现细节。
2. 直接可见的模型文件(用户友好层)
用途
- 用户直接使用的文件,包含模型配置、权重和分词器。
- 这些文件是
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等文件可手动编辑。
3. 两者关系图解
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
4. 用户操作建议
何时需要关注 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即可。
5. 示例对比
场景:下载 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 工具管理的文件存储区域。以下是具体解释:
1. 目录结构含义
| 目录名 | 用途 | 是否可手动修改 |
|---|---|---|
blobs |
存储实际的文件内容(如模型权重、数据集等),文件以哈希值命名(如 sha256:a1b2c3...)。 |
❌ 不要直接修改 |
refs |
记录指针文件,指向 blobs 中的具体文件版本(类似 Git 的引用系统)。 |
❌ 不要直接修改 |
snapshots |
保存不同版本(commit)的文件快照,每个子目录对应一个版本,内部文件链接到 blobs。 |
❌ 不要直接修改 |
2. 为什么会出现这些目录?
(1) 通过 Git LFS 克隆仓库
如果你运行过以下命令:
git clone https://huggingface.co/<模型名> # 模型仓库默认启用 Git LFS
Git LFS 会自动创建这些目录来管理大文件(如 pytorch_model.bin)。
(2) 使用 Hugging Face 工具下载模型
通过以下方式下载模型时,Hugging Face 库会使用类似结构缓存文件:
from transformers import AutoModel
model = AutoModel.from_pretrained("bert-base-uncased") # 缓存到 ~/.cache/huggingface/hub/
3. 用户应该关注什么?
(1) 实际可用的模型文件在哪里?
-
通过
snapshots/<commit-hash>/下的符号链接访问最终文件,例如:ls -l snapshots/a1b2c3d/ # 会看到 config.json、pytorch_model.bin 等文件这些文件是
blobs中实际数据的快捷方式。
(2) 如何正确使用这些文件?
-
代码加载:无需直接操作这些目录,用库函数自动处理:
from transformers import AutoModel model = AutoModel.from_pretrained("./path_to_model") # 自动解析内部结构 -
手动查看:可通过
tree命令观察完整结构:tree -L 3 # 显示3层目录结构
4. 常见问题
Q1: 能直接删除 blobs 吗?
-
不建议:会导致文件损坏。若需清理,删除整个仓库或缓存目录:
rm -rf ~/.cache/huggingface/hub/models--bert-base-uncased # Hugging Face 缓存
Q2: 为什么 snapshots 下有多个子目录?
-
每个子目录对应一个模型版本(不同 commit)。通过
revision参数指定版本:model = AutoModel.from_pretrained("bert-base-uncased", revision="a1b2c3d")
Q3: 如何提取出普通文件?
-
复制
snapshots中最新版本的文件即可:cp -r snapshots/a1b2c3d/* ./model_files/ # 得到可直接使用的文件
5. 总结
- 这些目录是自动管理的:用户通常无需直接操作。
- 关键文件在
snapshots/下:通过符号链接指向blobs中的真实数据。 - 安全操作建议:
- 使用
git lfs或 Hugging Face 工具管理文件。 - 手动修改可能导致数据损坏。
- 使用
如果需要进一步调试,可以提供你执行的具体命令或代码上下文。
十二、将hugging face 模型下载到远程ssh的方法
将 Hugging Face 模型从本地缓存(含 blobs/refs/snapshots 结构)迁移到远程服务器时,不建议直接复制这些目录,因其内部结构复杂且依赖符号链接。以下是高效、安全的迁移方案:
1. 推荐方法:通过 Hugging Face 工具直接下载到远程
(1) 使用 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)。
(2) 代码中指定远程路径
from transformers import AutoModel
# 直接下载到远程路径(需有写入权限)
model = AutoModel.from_pretrained("bert-base-uncased", cache_dir="/remote/path/to/cache")
2. 手动迁移:提取有效文件(适用于无外网服务器)
(1) 从本地缓存提取所需文件
# 定位到模型的 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
(2) 上传到远程服务器
# 本地压缩文件上传
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/"
(3) 远程加载验证
from transformers import AutoModel
model = AutoModel.from_pretrained("/path/to/model") # 指向解压后的目录
3. 高级场景:保持 Git LFS 结构同步
若需完全复制 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"
4. 注意事项
-
权限问题:
- 确保远程目录可写:
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")
-
5. 自动化脚本示例
#!/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 同步 | 需要维护完整仓库历史 | 保留所有版本和元数据 | 占用空间大,操作复杂 |
推荐选择:
- 95% 的场景用 方法1(远程直接下载) 或 方法2(手动打包)。
- 仅在需要版本控制时用方法3。
–
十三、本地下载模型导入远程服务器
本地下载模型并导入远程服务器的步骤指南
基本流程概述
- 在本地下载所需模型
- 将模型文件传输到远程服务器
- 在远程服务器上配置模型环境
- 验证模型是否正常工作
详细步骤
1. 本地下载模型
方法一:使用Hugging Face模型库
# 安装必要的库
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('./本地模型目录')
"
方法二:直接下载模型文件
- 访问Hugging Face模型库(https://huggingface.co/models)
- 找到所需模型,点击"Files and versions"
- 下载所有相关文件到本地目录
2. 传输模型到远程服务器
方法一:使用SCP命令
scp -r ./本地模型目录 用户名@远程服务器IP:/远程/目标/路径
方法二:使4用rsync(适合大文件)
rsync -avz --progress ./本地模型目录 用户名@远程服务器IP:/远程/目标/路径
方法三:使用SFTP客户端(如FileZilla)
- 打开SFTP客户端
- 连接到远程服务器
- 将本地模型目录拖拽到远程目标路径
3. 远程服务器配置
安装必要依赖
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/不存在对应的目录,程序是否会帮忙创建?
不会
解释如下
在大多数情况下,程序不会自动创建不存在的目录,需要你手动提前创建或通过命令参数显式指定自动创建。以下是不同场景下的具体行为和处理方法:
1. Hugging Face 工具的行为
(1) 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
(2) 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")
2. 文件传输工具的行为
(1) 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/
(2) 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"
3. 最佳实践:始终显式创建目录
通用命令模板
# 上传前确保远程目录存在
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"
4. 特殊情况处理
(1) 无权限创建目录
-
如果无法在目标位置(如
/opt)创建目录:# 尝试用户主目录 REMOTE_PATH="$HOME/projects/models" # 或联系管理员获取权限 ssh user@remote_server "sudo mkdir -p /opt/models && sudo chown $USER /opt/models"
(2) 需要递归创建多级目录
-
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终端当前目录下所有文件目录
在 SSH 终端中查看当前目录下的所有直接子目录(即根目录,非递归显示),可以使用以下命令:
1. 查看当前目录下的所有子目录
ls -d */
-
效果:仅显示当前目录下的子目录(以
/结尾),忽略文件。 -
示例输出:
bin/ data/ etc/ models/ tmp/
2. 显示详细信息(权限、大小等)
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/
3. 仅显示目录名(不含 / 后缀)
ls -d */ | sed 's|/$||'
或使用 find:
find . -maxdepth 1 -type d ! -name "." | sed 's|^\./||'
-
示例输出:
bin data models
4. 区分目录和文件
如果想同时查看目录和文件,但明确区分目录:
ls -F | grep '/$'
-F参数:在目录后添加/,可执行文件后添加*。grep '/$':筛选出目录。
5. 统计子目录数量
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 并传输到远程服务器的指定位置:
步骤 1:在本地下载缺失的分词器文件
方法A:使用 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
方法B:通过 Python 代码下载
from huggingface_hub import snapshot_download
# 下载分词器相关文件
snapshot_download(
repo_id="bert-base-uncased",
allow_patterns=["tokenizer*.json", "vocab.txt"],
local_dir="./tokenizer_files"
)
步骤 2:将文件打包传输到远程服务器
(1) 本地打包文件
tar -czvf tokenizer_files.tar.gz -C ./tokenizer_files .
(2) 传输到远程服务器
scp tokenizer_files.tar.gz user@remote_server:/target/model/path/
- 参数说明:
user@remote_server:远程服务器的用户名和地址/target/model/path/:远程模型目录(需替换为实际路径)
步骤 3:在远程服务器解压并验证
(1) 登录远程服务器
ssh user@remote_server
(2) 解压文件到模型目录
# 进入目标目录
cd /target/model/path/
# 解压(保留原文件结构)
tar -xzvf tokenizer_files.tar.gz
# 删除压缩包(可选)
rm tokenizer_files.tar.gz
(3) 验证文件完整性
ls -lh /target/model/path/
-
应看到新增文件:
tokenizer.json tokenizer_config.json vocab.txt
步骤 4:测试分词器加载
在远程服务器上运行 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 则必需 |
常见问题解答
Q1: 如果模型没有 tokenizer.json 怎么办?
-
旧版模型可能只有
vocab.txt+tokenizer_config.json,此时只需下载这两个文件:huggingface-cli download bert-base-uncased \ --filename tokenizer_config.json \ --filename vocab.txt \ --local-dir ./tokenizer_files
Q2: 如何下载所有分词器相关文件?
-
使用通配符:
huggingface-cli download bert-base-uncased \ --filename "tokenizer*" \ --filename "vocab*" \ --local-dir ./tokenizer_files
Q3: 国内下载慢如何加速?
-
使用镜像站点:
HF_ENDPOINT=https://hf-mirror.com huggingface-cli download bert-base-uncased \ --filename tokenizer.json \ --local-dir ./tokenizer_files
进阶用法
1. 指定模型版本(revision)
huggingface-cli download bert-base-uncased \
--revision v1.0.0 \ # 指定git标签或commit hash
--filename tokenizer.json \
--local-dir ./tokenizer_files
2. 只下载缺失文件
huggingface-cli download bert-base-uncased \
--filename tokenizer.json \
--local-dir ./tokenizer_files \
--force-filename # 若文件已存在则跳过
完整工作流示例
步骤 1:下载文件
huggingface-cli download bert-base-uncased \
--filename tokenizer.json \
--filename tokenizer_config.json \
--local-dir ./tokenizer_files
步骤 2:验证文件
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
步骤 3:加载测试
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]}
通过此命令,你可以高效地补全远程服务器缺失的分词器文件,而无需下载整个模型。
2025.4.10更新
十六、ssh登不进去如何查看问题
以下是关于命令 sudo nano /etc/ssh/sshd_config 的详细解释:
一、命令拆解
| 部分 | 作用 |
|---|---|
sudo |
以超级管理员权限执行命令(需输入当前用户密码) |
nano |
一个简单的命令行文本编辑器 |
/etc/ssh/sshd_config |
SSH服务端的配置文件路径(控制远程登录、端口等关键设置) |
二、核心作用
这条命令用于 编辑SSH服务器的配置,常见应用场景包括:
- 修改SSH端口(默认22 → 其他端口防扫描)
- 禁止root用户远程登录(提升安全性)
- 启用/禁用密码认证(改用密钥登录)
三、配置文件关键参数示例
# 常用配置项(在nano中编辑时):
Port 2222 # 更改SSH端口
PermitRootLogin no # 禁止root远程登录
PasswordAuthentication no # 禁用密码登录(仅密钥)
AllowUsers alice bob # 只允许特定用户登录
四、操作流程
-
执行命令:
sudo nano /etc/ssh/sshd_config- 输入密码后进入编辑界面。
-
修改配置:
- 用方向键移动光标,直接编辑文本。
- 注意:
#开头的行是注释,需去掉#才能生效。
-
保存退出:
Ctrl+O→ 回车保存Ctrl+X退出nano
-
重启SSH服务:
sudo systemctl restart sshd # Ubuntu/Debian sudo service sshd restart # CentOS
五、注意事项
- 备份原配置:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak - 语法检查:
sudo sshd -t # 测试配置是否正确 - 防锁死:
- 修改端口前,确保防火墙放行新端口。
- 禁用密码登录前,需先在客户端配置密钥登录。
六、可视化操作对比
| 操作 | 命令行方式 | GUI方式(如VS Code) |
|---|---|---|
| 编辑速度 | 快(无需启动图形界面) | 慢(需文件管理器导航) |
| 适用场景 | 服务器/远程终端 | 本地开发环境 |
| 学习成本 | 需记忆基本nano命令(如保存/退出) | 鼠标操作直观 |
七、常见问题
Q:误修改导致SSH无法连接怎么办?
A:通过服务器控制台(如AWS EC2的Instance Connect)登录,恢复备份:
sudo cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config
sudo systemctl restart sshd
Q:如何查看当前SSH配置是否生效?
A:运行:
sudo sshd -T | grep -i "permitrootlogin\|port\|passwordauthentication"
通过此命令,您可以精细控制服务器的远程访问权限,建议修改前充分理解每个参数的含义。如需具体安全加固方案,可进一步探讨!
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)