目录常用快捷键tmux:( SSH 断开后任务不中断 )系统CrontabLinux/Mac:创建定时任务一些终端执行命令将环境配置生成一个文件执行.sh文件Git 命令上传本地代码到Github先决条件本地仓库操作远程仓库操作其他常见git相关操作常见Linux命令查找并关闭进程 kill压缩文件并迁移到另一个服务器Python 常见数据处理命令MongoDB获取 Collection集合的文档总数strip()sort_values()requestdumps/loads/dump/load多进程加快处理速度EXAMPLE:EXCEL数据处理文件技巧常用快捷键删除当前行CtrlX打开命令CtrlShiftP搜索文件CtrlP文件之间切换CtrlTab关闭当前TabCtrlW跳转到行数CtrlG选中一行CtrlL再往后选中一行CtrlL删除光标后一个Delete向上或向下移动一行AltUp或AltDown选中多行同时编辑Alt鼠标左键选择和取消选择多个词CtrlD和CtrlU向上或向下复制一行ShiftAltUp或ShiftAltDowntmux:( SSH 断开后任务不中断 )安装tmux:如果你的系统中没有tmux先通过包管理器安装sudo apt install tmux创建新的tmux会话# 创建名为 py_session 的会话可自定义名称 tmux new -s py_session执行后会进入一个新的tmux会话窗口在会话中直接运行py文件。查看会话列表tmux ls分离会话保持程序运行先按 ctrl B再按D程序会在后台继续运行回到原来的终端。重新连接会话# 连接指定名称的会话 tmux attach -t py_session终止回话在会话内直接输入exit/ctrlD常见快捷键使用系统CrontabLinux/Mac:创建定时任务安装并开启cron 服务# 安装 cron 服务Debian/Ubuntu 容器 sudo apt update sudo apt install -y cron # 安装后启动并设置自启 sudo service cron start确认服务已经启动# 1. 启动 cron 服务Debian/Ubuntu 系统 sudo service cron start # 2. 确认服务已启动显示 running 则成功 sudo service cron status # 运行后会显示* cron is running 表示已开启 # 3. 设置开机自启避免容器重启后服务停止 sudo systemctl enable cron编辑crontab:crontab -e添加新的定时任务ctrl O/ O)会出现-- INSERT --此时可以插入新的内容添加完成后先退出 insert 模式Esc再输入:wq即可退出。查看任务列表crontab -l详细请参考Linux中Crontab定时任务命令详解及使用教程_linux定时任务命令-CSDN博客一些终端执行命令将环境配置生成一个文件激活环境在需要配置的目录下生成文件pip freeze requirements.txt执行.sh文件# 1. 进入脚本所在目录 若不在当前目录cd /path/to/script/directory # 替换为脚本存放的文件夹路径# 2. 给脚本添加执行权限 首次运行时需要注意要切换到sh文件的母目录chmod x train_sft_lora.sh# 3. 运行脚本./train_sft_lora.shGit 命令上传本地代码到Github在github上初始化一个自己的分支将本地代码上传到远程仓库中先决条件注册 GitHub 账号访问GitHub 官网按照提示注册一个账号。安装 Git根据你的操作系统从Git 官方网站下载并安装 Git。配置 Git 用户名和邮箱打开终端或命令行工具输入以下命令配置你的 GitHub 用户名和邮箱git config --global user.name 你的GitHub用户名 git config --global user.email 你的GitHub注册邮箱本地仓库操作1.创建本地 Git 仓库进入你要上传的代码所在的项目文件夹在终端中输入git init2.添加文件到暂存区可以使用以下命令添加所有文件到暂存区git add . #如果只想添加特定文件可将.替换为文件名如git add README.md。3.提交更改输入以下命令提交更改并添加一个有意义的提交信息git commit -m 提交信息远程仓库操作1.在 GitHub 创建新仓库登录 GitHub 账号点击右上角的 “” 图标选择 “New repository”。填写仓库名选择仓库的公开或私有属性不要勾选 “Initialize this repository with a README”因为本地已有代码然后点击 “Create repository”。2.关联远程仓库并推送在终端中输入以下命令将本地仓库与 GitHub 上新建的仓库关联https连接ssh连接更稳定git remote -v # 输出目前连接时哪一种 ssh -T gitgithub.com #测试目前能不能连接github ## Hi 用户名Youve successfully authenticated 说明成功通过 SSH 成功连接到 GitHub 了# 生成新的 SSH 密钥一路回车默认即可 ssh-keygen -t ed25519 -C 你的 GitHub 邮箱 # 查看公钥并复制 cat ~/.ssh/id_ed25519.pub ## 在~/.ssh/下添加config文件增加以下内容 # 添加以下内容强制 SSH 走 443 端口避免 22 端口被封 Host github.com Hostname ssh.github.com Port 443 IdentityFile ~/.ssh/id_ed25519 # 指向你的私钥文件git remote add origin https://github.com/你的用户名/仓库名.git # git remote set-url origin https://github.com/你的用户名/仓库名.git # git remote set-url origin gitgithub.com:你的用户名/仓库名.git SSH连接更稳定但需要配置公钥3.将默认分支改名为mainGitHub 新仓库要求git branch -M main4.推送本地代码到 GitHub 仓库git push -u origin main注意如果第4步报错本地分支和远程分支存在 “分歧”各自有对方没有的提交Git 不知道该用哪种方式合并需要明确指定合并策略本地仓库和远程仓库初始时没有共同的提交历史“unrelated histories”因此 Git 无法自动判断合并方式。--no-rebase告诉 Git 直接用合并merge的方式将两个分支的内容结合生成一个新的合并提交这样既能保留双方的历史又能解决分歧。git pull origin main --allow-unrelated-histories --no-rebase此时运行完再进行推送就可以成功推送代码了。刷新页面可以看到刚刚上传的代码文件了后续修改代码只需执行以下简化命令即可更新到GitHub上#1. 查看所有修改包括未暂存和已暂存的文件最常用的命令是 git status它会显示工作区和暂存区的文件# 状态 git status 输出说明 Untracked files未跟踪文件新创建的文件Git 尚未记录。 Changes not staged for commit已修改但未暂存已存在的文件被修改但未执行 git add。 Changes to be committed已暂存待提交已执行 git add等待 git commit。 git add . # 添加所有修改的文件 git commit -m 描述你的修改内容比如修复DPO训练的格式错误 git pull # 先拉取远程最新更新避免冲突 git push # 直接推送无需再写 origin main其他常见git相关操作# 当前所在分支git branch# 新建分支新建文件夹将分支名代码复制到当前路径下 git clone -b 分支名 gitcodeup.aliyun.com:xxx.git (git ssh连接/https连接#拉取分支最新代码场景核心命令流程首次拉取直接克隆cd 目标文件夹会拉取到文件夹目录下→git clone 远程仓库地址→cd 仓库文件夹已有仓库安全拉取cd 仓库文件夹→git fetch origin→git diff origin/main可选→git merge origin/main已有仓库快速拉取cd 仓库文件夹→git pull origin main或简化git pull# 建立新分支并合并推导主分支先在远程创建如通过 GitHub/GitLab 网页端新建分支new在本地仓库同步远程的新增分支本地仓库默认不会自动同步rootxxx:~/Code# git fetch origin From github.com:xxx/Code * [new branch] new - origin/new确认新的分支是否存在rootxxx:~/Code# git branch -r origin/HEAD - origin/main origin/main origin/new创建本地分支并关联到远程的新增分支rootxxx:~/Code# git checkout -b new origin/new Branch new set up to track remote branch new from origin. Switched to a new branch new在新分支修改开发并提交修改# 查看修改的文件 git status # 添加修改到暂存区 git add 文件名 # 或 git add . 添加所有修改 # 提交修改到本地 new 分支 git commit -m 描述修改内容例如 修复XX功能bug # 推送到远程 new 分支备份并让其他人可见 git push origin new合并到main分支# 切换到 main 分支 git checkout main # 拉取远程 main 分支的最新代码避免冲突 git pull origin main # 合并 new 分支到当前 main 分支 git merge new # 若合并时有冲突手动编辑冲突文件后重新提交 git add 冲突文件 git commit -m 解决 new 分支合并到 main 的冲突 # 推送合并结果到远程 main 分支 git push origin main常见Linux命令# 1.当前文件夹所占空间大小du -sh# 2. 查看当前文件夹下一级子文件大小du -h --max-depth1# 3. 以长格式、人类可读的大小单位显示当前目录下所有文件和子目录的详细信息ll -lh# 4. 重新加载环境/重启终端source ~/.bashrc# 5. 删除文件夹# 1.删除空文件夹 rm -d 文件夹名 # 2.删除非空文件夹带确认 rm -r 文件夹名 # 3.强制删除非空文件夹无确认 rm -rf 文件夹名删除特定文件夹/目标目录路径替换为你要操作的目录例如当前目录用.表示-maxdepth 1只搜索目标目录下的直接子文件夹不递归到更深层级-type d只匹配文件夹目录-name *2025-09*匹配名称中包含2025-09的文件夹*是通配符-exec rm -rf {} 对找到的每个文件夹执行强制删除操作find /目标目录路径 -maxdepth 1 -type d -name *2025-09* -exec rm -rf {} 建议先确认再删除# 先执行此命令确认要删除的文件夹重要避免误删 find . -maxdepth 1 -type d -name *2025-09* # 确认无误后执行删除 find . -maxdepth 1 -type d -name *2025-09* -exec rm -rf {} 查找并关闭进程 kill PID要详细查看所有占用NVIDIA GPU的进程以及资源占比# 1.首选最全面nvidia-smi显示 GPU 利用率、显存占用等nvidia-smi# 2.查找隐藏占用进程nvidia-smi显示 GPU 显存已占用但 Processes 列表为空通常是因为进程与 GPU 的关联方式特殊或系统 / 驱动层面的信息同步问题可按以下步骤定位隐藏的占用进程# 查看所有使用 NVIDIA 设备文件的进程详细模式 sudo fuser -v /dev/nvidia*# 3.进一步验证查看进程详细信息显示该进程是由哪个脚本 / 程序启动的如python train.py方便确认是否为需要终止的进程。# 替换 PID 为 fuser 找到的进程ID查看完整命令和用户 ps -p PID -f# 4.杀死进程kill PIDkill不掉的话使用ps命令查看进程的实际状态判断是否能被杀死ps -aux | grep PID重点看输出的STAT列进程状态状态为D不可中断睡眠状态为R/S运行/可中断睡眠进程可以被正常杀死增加优先级提高权限sudo kill PID状态为Z进程已死亡僵尸进程查看父进程再kill.pstree -p PID #查看父进程 sudo kill -9 PID #父进程的pid强制终止信号万不得已用sudo kill -9 PID可以用 ps -p PID -f 验证是否杀死了进程ps -p PID -f # 若输出“PID TTY TIME CMD”且无进程信息说明已杀死压缩文件并迁移到另一个服务器1.压缩文件夹-- -c创建压缩包、-z用 gzip 压缩、-v显示过程、-f指定文件名tar -czvf 文件夹名.tar.gz /path/to/你的文件夹/2.传输到目标服务器的目标文件夹scp 文件夹名.tar.gz 目标服务器用户名目标服务器IP:/path/to/target/dir/默认端口号是22如果不是eg. 2222) 需要在前面加上端口号并注意P是大写eg:scp -P 2222 output_ads_cot.tar.gz rootconnect.nma1.seetacloud.com:/root/autodl-tmp/zy/ms-swift-test/output_sft_7b/v7/成功3.在目标服务器中解压文件夹 先定位到当前目录# 解压到当前目录 tar -xzvf 文件夹名.tar.gztar -xzvf 命令用于解压 .tar.gz 格式的压缩包tar 归档 gzip 压缩.gz 是 gzip 单独压缩的文件仅压缩不归档需用 gzip -d 解压。默认删除源文件若需要保留加-k参数gzip -dk xxx.txt.gzPython 常见数据处理命令MongoDB获取Collection集合的文档总数MongoDB 是一种文档型数据库属于 NoSQL 数据库范畴构成数据为集合Collection、文档Documenttotal_cnt collection.count_documents({}) print(f集合中所有数据的总个数{total_cnt}) # 统计不同id下对应文档的数量 pipeline [ # 按 id 分组并用 $sum 统计每个分组的文档数 {$group: {_id: $id, count: {$sum: 1}}} ] #执行聚合查询,得到[{_id:xx,count:XX},{},...] id_cnt list(collection.aggregate(pipeline)) print(fid数量{len(id_cnt)})strip() strip() 是字符串对象的一个内置方法用于移除字符串开头和结尾的指定字符默认为空白字符 string.strip([chars]) string.strip() # chars 如果省略则默认移除空白字符包括空格、制表符 \t、换行符 \n 等 ## chars 参数中的字符顺序不影响匹配。 text abcXYZ print(text.strip(cbaZYX)) # 输出: 所有字符被移除 lstrip() #仅移除左侧字符。 rstrip() #仅移除右侧字符。sort_values()# df是一个DataFrame类型的数据 df df.sort_values(by xxx) #对df的某个特定字段xxx默认升序排序并返回一个新的DataFrame df df.sort_values(by xxx, ascending False) #降序request# requests.post用于发送 HTTP POST 请求通常用于提交数据到服务器例如创建/更新资源 requests.post( http://localhost:8100/pinterest/xxx/xxx, # 目标URL路径 jsondata # 请求体JSON格式的数据 ) # 目标URL路径 http://localhost:8100目标服务器地址localhost表示本地机器8100是端口号。 /pinterest/xxx/xxxAPI 的具体路径eg:一个 Pinterest 相关的接口。 # 请求体Body是一个 JSON 格式的数据data 是 Python 字典如 {name: test, id: 123}会自动被 requests 序列化为 JSON 字符串。 jsondata dumps/loads/dump/load在 Python 的 json 模块中dumps、dump、loads、load 是处理 JSON 数据的四个核心函数核心区别(1)dumps/loads: json字符串与python文件之间的转换(2)dump/load:json文件与python文件之间的转换 json.dumps()将python对象转化为json字符串 import json data {name: 张三, age: 20} json_str json.dumps(data, ensure_asciiFalse) # 转换为JSON字符串 print(json_str) # 输出{name: 张三, age: 20} print(type(json_str)) # 输出class str json.dump()将python对象写入json文件 with open(data.json, w, encodingutf-8) as f: json.dump(data, f, ensure_asciiFalse, indent2) # 写入文件并格式化 json.loads()将json格式的字符串转化为python对象 import json json_str {name: 张三, age: 20} data json.loads(json_str) # 转换为Python字典 print(data) # 输出{name: 张三, age: 20} print(type(data)) # 输出class dict json.load()从json文件中读取内容并转化为python对象 json_str {name: 张三, age: 20} with open(data.json, r, encodingutf-8) as f: data json.loads(f) # 从文件读取并转换为Python对象 print(data) # 输出{name: 张三, age: 20} print(type(data)) # 输出class dict多进程加快处理速度EXAMPLE:import multiprocessing from multiprocessing import Pool, Lock, Manager from tqdm import tqdm # 定义处理函数 def init_worker(model_path): global model, tokenizer # 每个子进程独立加载模型 #加载分词器 tokenizer AutoTokenizer.from_pretrained(model_path, trust_remote_codeTrue) # 允许执行模型的远程代码Qwen特有的配置 tokenizer.padding_side right tokenizer.pad_token tokenizer.eos_token model AutoModelForCausalLM.from_pretrained(model_path).to(cuda) print(f子进程 {multiprocessing.current_process().pid} 模型加载完成) def process_function(row): 处理内容:对每一行row处理 #return response #仅仅输出处理结果 #return row.name, response #定位处理的行数以及对应结果后续好收集对应处理 if __name__ __main__: # 关键设置启动方式为 spawn必须放在所有进程操作之前 multiprocessing.set_start_method(spawn, forceTrue) # 添加这一行 # 创建进程池 print(multiprocessing.cpu_count : , multiprocessing.cpu_count()) input_path xxx/raw_data.xlsx pf pd.read_excel(input_path) if model_answer not in pf.columns: pf[model_answer] None # 新增列用于存储结果 # 设置两个子进程这里的initializerinit_worker, initargs(model_path,)只有在你对不同的子进程需要进行初始设置的时候定义函数init_worker(),参数就是model_path;在这里就是两个子进程都需要加载本地模型 with Pool(processes2, initializerinit_worker, initargs(model_path,)) as pool: results [] with tqdm(totallen(pf), desc 处理进度) as pbar: # 用Manager创建共享列表存储结果避免多进程数据竞争 manager Manager() results manager.list() # 存储 (行索引, 响应) 元组 # 定义回调函数更新进度条并暂存结果 def update_progress(result): results.append(result) # 存储结果到共享列表 pbar.update(1) # 错误处理函数 def error_handler(e): print(fTask failed after retries: {str(e)}) # 提交所有任务,处理数据的每一行 futures [] for _, row in pf.iterrows(): future pool.apply_async(process_single_row, args(row, ), callbackupdate_progress, error_callbackerror_handler) futures.append(future) # 等待所有任务完成 for future in futures: future.wait() # 关闭进程池 pool.close() pool.join() # 合并结果 for idx, response in results: pf.at[idx, model_answer] response #用at方法精准定位 # 保存结果 output_path xxx/results/data_answer.xlsx pf.to_excel(output_path, index False) print(f处理完成已保存{len(results)}条结果至{output_path})EXCEL数据处理文件技巧1.AltEnterexcel 换行2.shift ↓选中一行3.TRIM(MID(A1,FIND(:,A1,FIND(操作:,A1)LEN(操作:))1,999))# 提取结果的操作使用excelFIND(:,A1,FIND(操作:,A1)LEN(操作:))从 “操作:” 之后开始查找第一个冒号的位置MID(...)从找到的冒号后一位开始提取提取长度为 999足够覆盖一般文本TRIM去除结果前后的空格