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. 使用 scprsync 同步文件

(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 专业版的远程开发功能

  1. 配置远程解释器
    File → Settings → Python Interpreter → Add → SSH Interpreter

    • 设置远程主机的路径映射(本地和远程目录自动关联)。
  2. 手动同步文件

    • 右键文件 → Deployment → Upload(上传到远程对应路径)。

5. 注意事项

  1. 路径一致性

    • 确保本地和远程的目录结构一致(例如本地 ./project/src 对应远程 ~/project/src)。
  2. 权限问题

    • 远程目录需有写入权限(用 ls -ld 检查权限)。
  3. 符号链接

    • 远程路径中的符号链接可能导致混淆,建议用 pwd -P 获取物理路径。
  4. 网络延迟

    • 大文件同步时建议用 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 密钥认证自动化脚本 提升效率。





三、将当前文件夹复制到远程目录下

将当前本地文件夹复制到远程服务器的目录下,可以通过以下方法实现。这里以 rsyncscp 两种常用工具为例,提供详细步骤和注意事项:


方法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/ [email protected]:/home/user/backup/
注意事项
  1. 如果远程目录不存在,rsync 会报错。可先创建目录:

    ssh user@remote_server "mkdir -p /path/to/remote/directory"
    
  2. 如需排除特定文件(如 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 [email protected]:/home/user/backup/
注意事项
  1. scp 会全量传输文件,不适合大文件夹或频繁同步。
  2. 传输中断后需重新开始,不支持断点续传。

方法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 [email protected] "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 ..
  • 直接回家目录cdcd ~
  • 切换目录cd /目标路径
  • 返回上一个目录cd -
  • 完全退出远程终端exitCtrl + 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 内置工具
  1. 打开远程主机窗口
    View → Tool Windows → Remote Host
  2. 浏览文件树,支持右键操作(上传/下载/编辑)。
(2) FileZilla(SFTP 客户端)
  1. 连接协议选择 SFTP,输入 SSH 凭据。
  2. 直接拖拽文件进行管理。
(3) VS Code 远程插件
  1. 安装 Remote - SSH 扩展。
  2. 连接后通过资源管理器浏览文件。

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. 注意事项

  1. 路径问题

    • 远程路径需用绝对路径,避免因工作目录不同导致的错误。

    • 特殊字符(如空格)需转义或加引号:

      ssh user@remote "cat '/path/with spaces/file.txt'"
      
  2. 权限控制

    • 确保 SSH 用户对远程文件有读取权限:

      ssh user@remote "ls -l /remote/path/file.txt"
      
    • 如需写入,检查目录的 w 权限。

  3. 性能优化

    • 大文件建议先下载或使用流式处理(如 ssh user@remote "cat bigfile.log" | grep "error")。
  4. 安全风险

    • 避免在命令中硬编码密码,使用 SSH 密钥认证。
    • 敏感文件传输时启用加密(如 scp -Crsync -e 'ssh -C')。

6. 常见问题解决

Q:报错 No such file or directory
  • 检查步骤

    1. 确认远程路径存在:

      ssh user@remote "ls /remote/path"
      
    2. 检查路径拼写(区分大小写)。

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 condaconda info
你要运行的 Python 文件 /home/yourname/project/run.py lsfind
项目/数据文件夹 /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(应用托管)
  • 功能
    免费部署AI应用的平台,支持Gradio、Streamlit等交互界面。
  • 案例
    • 文本生成Demo
    • 图像分类App

2. 技术优势

特性 说明
开源免费 核心库(Transformers、Datasets)完全开源,商用友好(Apache 2.0协议)
跨框架支持 同一模型可无缝切换PyTorch/TensorFlow/JAX
高效推理 支持量化(8-bit/4-bit)和ONNX导出,提升推理速度
社区驱动 开发者可上传模型、数据集,共享使用经验

3. 典型应用场景

  1. 快速原型开发

    # 5行代码实现文本摘要
    from transformers import pipeline
    summarizer = pipeline("summarization")
    summarizer("长文本内容...", max_length=130)
    
  2. 微调预训练模型

    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()
    
  3. 部署生产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. 学习资源

  1. 官方文档
    • Transformers 教程
    • 课程(免费中文版)
  2. 实践项目
    • 克隆现成Space:GPT-2聊天机器人
    • 微调指南:Fine-tune BERT

6. 企业服务

  • Hugging Face Hub Pro
    私有模型托管、团队协作功能($9/用户/月)。
  • Inference Endpoints
    专有云托管,低延迟推理(按需计费)。
  • 定制支持
    为企业提供模型优化和部署咨询服务。

通过Hugging Face,开发者可以跳过繁琐的模型训练和部署流程,直接利用最先进的AI技术构建应用。其开放的生态系统和活跃的社区,使其成为AI领域的“GitHub”。



II下载错误分析

这个错误表明在通过 huggingface-clifrom_pretrained() 下载模型时,网络连接中断,导致文件下载不完整。具体原因是:


错误原因分析

  1. 核心问题

    • 下载大模型文件时(此处尝试下载约 519MB 的文件),网络连接不稳定或被中断。
    • 错误信息显示:已下载 14.5MB,但剩余 519MB 未完成。
  2. 直接触发点

    • 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. 手动下载模型文件
  1. 通过浏览器下载

    • 访问 Hugging Face 模型页面,手动下载文件到 ~/.cache/huggingface/hub/
  2. 使用 wgetcurl

    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  # 最大重试次数
)

其他可能原因

  1. 代理问题

    • 如果使用代理,检查代理设置:

      echo $http_proxy  # 查看是否配置了代理
      
    • 临时关闭代理:

      unset http_proxy https_proxy
      
  2. 磁盘空间不足

    • 检查磁盘剩余空间:

      df -h  # 查看磁盘使用情况
      
  3. 防火墙限制

    • 确保未屏蔽 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 模型存储和管理系统中,blobsrefssnapshots 和直接看到的 config.jsonpytorch_model.bin 等文件代表了不同的存储层级和访问方式。以下是它们的核心区别和关联:


1. blobsrefssnapshots(Git LFS 内部结构)

用途
  • Git LFS(大文件存储) 的底层管理结构,用于高效管理大模型文件。
  • 这些目录是 Hugging Face Hub 缓存直接克隆模型仓库(含 LFS) 时自动生成的。
具体内容
目录 内容 用户是否需要直接操作?
blobs 存储文件的实际内容(二进制数据),按哈希值命名(如 sha256:a1b2c3...)。 ❌ 一般不直接操作
refs 存储指向 blobs引用(如分支、标签对应的文件版本)。 ❌ 一般不直接操作
snapshots 记录不同提交(commit)对应的文件快照,映射到 blobs 中的具体文件。 ❌ 一般不直接操作
特点
  • 自动生成:通过 git lfshuggingface-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
  1. 调试下载问题:检查文件是否完整下载(如 blobs 中是否有大文件)。
  2. 手动清理缓存:删除 ~/.cache/huggingface/hub/ 下的缓存目录。
  3. 直接克隆模型仓库:使用 git lfs clone 时会看到这些目录。
何时使用直接可见的文件?
  1. 代码加载模型

    from transformers import AutoModel
    model = AutoModel.from_pretrained("./path_to_model")  # 读取 config.json/pytorch_model.bin
    
  2. 修改配置:直接编辑 config.json 调整模型参数。

  3. 分享模型:打包 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 blobsrefssnapshots 目录的意思

你看到的 blobsrefssnapshots 目录是 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// 下的符号链接访问最终文件,例如:

    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. 注意事项

  1. 权限问题

    • 确保远程目录可写:ssh user@remote "chmod -R 755 /path/to/model"
  2. 存储空间

    • 大模型(如LLaMA-2)可能占用数十GB,检查远程磁盘空间:

      ssh user@remote "df -h /path/to/model"
      
  3. 版本一致性

    • 使用 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. 在本地下载所需模型
  2. 将模型文件传输到远程服务器
  3. 在远程服务器上配置模型环境
  4. 验证模型是否正常工作

详细步骤

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)
  1. 打开SFTP客户端
  2. 连接到远程服务器
  3. 将本地模型目录拖拽到远程目标路径

3. 远程服务器配置

安装必要依赖
ssh 用户名@远程服务器IP
pip install transformers torch  # 或其他模型所需的库
验证模型加载
from transformers import AutoModel, AutoTokenizer
model = AutoModel.from_pretrained('/远程/目标/路径/本地模型目录')
tokenizer = AutoTokenizer.from_pretrained('/远程/目标/路径/本地模型目录')
print("模型加载成功!")
注意事项
  1. 模型大小:大型模型可能需要很长时间传输,考虑压缩后传输

    tar -czvf model.tar.gz ./本地模型目录
    scp model.tar.gz 用户名@远程服务器IP:/远程/目标/路径
    # 在远程服务器上解压
    tar -xzvf /远程/目标/路径/model.tar.gz -C /远程/目标/路径
    
  2. 权限问题:确保远程服务器有足够的存储空间和写入权限

  3. 环境一致性:保持本地和远程的Python环境、库版本一致

  4. 网络稳定性:大文件传输建议使用稳定的网络连接

替代方案:直接从远程服务器下载

如果服务器可以访问外部网络,更简单的方法是直接在远程服务器上下载:

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
  • 输出:数字表示子目录总数。

注意事项

  1. 隐藏目录:上述命令默认不显示以 . 开头的隐藏目录。若需包含隐藏目录:

    ls -d .*/ */ | grep -v '^\.\./$'  # 排除父目录链接
    
  2. 符号链接目录
    ls -d */ 会包含符号链接目录。若需排除:

    ls -l | grep '^d' | awk '{print $9}'  # 仅真实目录
    
  3. 远程目录权限
    如果某些目录无读取权限,会显示错误。可忽略错误:

    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!"))  # 测试编码

关键注意事项

  1. 路径一致性

    • 确保远程的 /target/model/path/ 是原模型目录,且其他文件(如 config.json)已存在。
    • 如果模型是自定义路径,需替换所有命令中的路径。
  2. 权限问题

    • 远程目录需有写入权限:

      ssh user@remote_server "chmod -R 755 /target/model/path/"
      
  3. 模型匹配

    • 下载的分词器文件必须与原模型兼容(如 bert-base-uncased 的分词器不能用于 gpt2)。
  4. 网络加速

    • 国内服务器下载时可添加镜像参数:

      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 设置文件保存的本地目录(会自动创建)

执行后的效果

  1. 目录结构
    命令会在当前路径下创建 ./tokenizer_files/ 目录,并包含以下文件:

    ./tokenizer_files/
    ├── tokenizer.json        # 分词器主配置(词汇表、特殊标记等)
    ├── tokenizer_config.json # 分词器类型和参数(如大写处理、截断设置)
    └── vocab.txt             # 词汇表(BERT等传统模型使用)
    
  2. 文件来源
    这些文件从 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]}

通过此命令,你可以高效地补全远程服务器缺失的分词器文件,而无需下载整个模型。

你可能感兴趣的:(ssh,运维,语音识别,linux,远程工作,经验分享,笔记)