ChatGLM-6B安全加固防止未授权访问的防护措施1. 引言当你把ChatGLM-6B这样的智能对话模型部署到服务器上通过Gradio界面提供Web服务时有没有想过这样一个问题谁都能访问这个服务吗想象一下这个场景你花了不少功夫部署好ChatGLM-6B配置了SSH隧道本地浏览器访问一切正常。但几天后你发现服务器的CPU和内存使用率异常飙升查看日志才发现有大量来自未知IP的请求在调用你的模型服务。更糟糕的是这些请求可能消耗了你的计算资源甚至尝试进行恶意操作。这就是我们今天要讨论的核心问题——未授权访问。对于部署在公网或内网中的ChatGLM-6B服务如果没有适当的安全防护就像把家门钥匙放在门口垫子下面一样危险。本文不是一篇枯燥的安全理论文章而是一份实战指南。我会带你一步步为ChatGLM-6B服务构建多层次的安全防护体系从最简单的访问控制到相对复杂的认证机制确保只有授权用户才能使用你的智能对话服务。2. 为什么需要安全加固在深入技术细节之前我们先搞清楚一个问题为什么要费这么大劲做安全加固2.1 未授权访问的风险资源滥用风险是最直接的威胁。ChatGLM-6B虽然比大参数模型轻量但每次推理仍然需要消耗GPU/CPU和内存资源。如果任何人都能无限制地调用你的服务计算资源被耗尽导致你自己的正常使用受影响可能产生高额的计算成本如果按使用量计费服务响应变慢甚至完全不可用数据安全风险也不容忽视。虽然ChatGLM-6B本身不存储用户对话数据但如果攻击者能够访问服务可能通过精心构造的输入进行模型逆向或提取训练数据可能利用服务进行不当内容生成可能将你的服务作为跳板攻击服务器上的其他应用法律合规风险在某些场景下也需要考虑。如果你的服务被用于生成不当内容而你又无法追溯使用者身份可能会面临法律风险。2.2 常见攻击场景让我用几个真实案例来说明问题端口扫描攻击攻击者使用自动化工具扫描公网IP的常用端口如7860发现开放的服务就尝试访问默认配置利用很多服务部署时使用默认配置攻击者利用已知的默认设置进行访问内网渗透即使服务只在内网开放如果内网其他设备被攻破你的服务也可能暴露2.3 安全加固的价值做好安全加固你得到的是可控的资源使用确保服务为你或你的团队所用服务稳定性避免因恶意请求导致服务崩溃合规与审计能够追踪谁在什么时候使用了服务安心使用不用担心一觉醒来发现服务器被挖矿了现在你对为什么需要安全加固有了清晰的认识接下来我们进入实战环节。3. 基础防护网络层访问控制最直接、最有效的防护措施往往在网络层。我们先从最简单的开始。3.1 修改默认端口Gradio默认使用7860端口这是公开信息。修改端口是最简单的防护措施之一。修改你的app.py文件中的Gradio启动配置import gradio as gr from transformers import AutoTokenizer, AutoModel # 加载模型和tokenizer tokenizer AutoTokenizer.from_pretrained(THUDM/chatglm-6b, trust_remote_codeTrue) model AutoModel.from_pretrained(THUDM/chatglm-6b, trust_remote_codeTrue).half().cuda() def chat(message, history): response, history model.chat(tokenizer, message, historyhistory) return response # 修改这里将7860改为其他端口比如8786 demo gr.ChatInterface( fnchat, titleChatGLM-6B安全服务, description经过安全加固的智能对话服务 ) if __name__ __main__: # 修改端口号并限制只监听本地 demo.launch(server_name127.0.0.1, server_port8786, shareFalse)为什么这样做有效端口扫描工具通常只扫描常见端口如80, 443, 22, 3389, 7860等使用非常用端口如8786, 9567等能避开大部分自动化扫描server_name127.0.0.1确保服务只监听本地回环地址3.2 配置防火墙规则即使修改了端口我们还需要防火墙来进一步控制访问。这里以Ubuntu系统的ufw防火墙为例# 安装ufw如果未安装 sudo apt update sudo apt install ufw -y # 启用防火墙 sudo ufw enable # 设置默认策略拒绝所有入站允许所有出站 sudo ufw default deny incoming sudo ufw default allow outgoing # 允许SSH连接必须否则无法远程管理 sudo ufw allow 22/tcp # 允许你的自定义端口比如8786但只允许特定IP访问 # 假设你的办公IP是123.123.123.123 sudo ufw allow from 123.123.123.123 to any port 8786 # 查看规则 sudo ufw status numbered # 如果需要删除某条规则 sudo ufw delete [规则编号]更精细的IP控制 如果你需要允许多个IP访问可以创建脚本批量添加#!/bin/bash # allow_ips.sh ALLOWED_IPS(123.123.123.123 124.124.124.124 125.125.125.125) for ip in ${ALLOWED_IPS[]}; do sudo ufw allow from $ip to any port 8786 echo 已允许IP: $ip 访问端口8786 done3.3 使用SSH隧道加强防护在基础防护中SSH隧道是最安全的方式之一。你已经在使用它但我们可以让它更安全。优化SSH隧道命令# 基础命令 ssh -L 8786:127.0.0.1:8786 -p 22 rootyour-server-ip # 增强安全性的命令 ssh -o ConnectTimeout30 -o ServerAliveInterval60 -L 8786:127.0.0.1:8786 -N -f rootyour-server-ip参数说明-o ConnectTimeout30连接超时30秒-o ServerAliveInterval60每60秒发送保活包-N不执行远程命令只做端口转发-f后台运行创建SSH配置简化连接 在~/.ssh/config中添加Host chatglm-server HostName your-server-ip User root Port 22 LocalForward 8786 127.0.0.1:8786 ServerAliveInterval 60 ServerAliveCountMax 3然后只需运行ssh -N -f chatglm-server4. 应用层防护身份验证机制网络层防护能阻止大部分未授权访问但如果攻击者进入了你的网络或者你需要与团队成员共享服务就需要应用层的身份验证。4.1 Gradio内置认证Gradio从3.0版本开始支持简单的HTTP基本认证这是最快捷的添加认证的方式。修改你的app.pyimport gradio as gr from transformers import AutoTokenizer, AutoModel # 配置认证信息 AUTH_USERNAME admin # 修改为你的用户名 AUTH_PASSWORD StrongPassword123! # 修改为强密码 # 加载模型同上 tokenizer AutoTokenizer.from_pretrained(THUDM/chatglm-6b, trust_remote_codeTrue) model AutoModel.from_pretrained(THUDM/chatglm-6b, trust_remote_codeTrue).half().cuda() def chat(message, history): response, history model.chat(tokenizer, message, historyhistory) return response demo gr.ChatInterface( fnchat, titleChatGLM-6B安全服务, description需要用户名和密码访问 ) if __name__ __main__: # 添加auth参数 demo.launch( server_name127.0.0.1, server_port8786, shareFalse, auth(AUTH_USERNAME, AUTH_PASSWORD), auth_message请输入用户名和密码访问ChatGLM-6B服务 )安全提示不要使用默认或弱密码定期更换密码不同环境使用不同密码不要在代码中硬编码密码下一步会解决这个问题4.2 使用环境变量管理凭证硬编码密码不安全我们改用环境变量import os import gradio as gr from dotenv import load_dotenv from transformers import AutoTokenizer, AutoModel # 加载环境变量 load_dotenv() # 从.env文件加载 # 从环境变量读取认证信息 AUTH_USERNAME os.getenv(GRADIO_USERNAME, admin) AUTH_PASSWORD os.getenv(GRADIO_PASSWORD) if not AUTH_PASSWORD: raise ValueError(请在.env文件中设置GRADIO_PASSWORD环境变量) # 加载模型 tokenizer AutoTokenizer.from_pretrained(THUDM/chatglm-6b, trust_remote_codeTrue) model AutoModel.from_pretrained(THUDM/chatglm-6b, trust_remote_codeTrue).half().cuda() def chat(message, history): response, history model.chat(tokenizer, message, historyhistory) return response demo gr.ChatInterface(fnchat) if __name__ __main__: demo.launch( server_name127.0.0.1, server_port8786, shareFalse, auth(AUTH_USERNAME, AUTH_PASSWORD) )创建.env文件不要提交到GitGRADIO_USERNAMEyour_username GRADIO_PASSWORDyour_strong_password_here在.gitignore中添加.env *.env4.3 多用户认证系统如果有多人需要使用服务基础认证就不够了。我们可以实现一个简单的多用户系统import os import json import hashlib import gradio as gr from typing import Dict, Optional from transformers import AutoTokenizer, AutoModel class UserManager: def __init__(self, users_file: str users.json): self.users_file users_file self.users self._load_users() def _load_users(self) - Dict: 加载用户数据 if os.path.exists(self.users_file): with open(self.users_file, r) as f: return json.load(f) return {} def _save_users(self): 保存用户数据 with open(self.users_file, w) as f: json.dump(self.users, f, indent2) def hash_password(self, password: str) - str: 密码哈希 return hashlib.sha256(password.encode()).hexdigest() def add_user(self, username: str, password: str, role: str user): 添加用户 if username in self.users: return False, 用户已存在 self.users[username] { password_hash: self.hash_password(password), role: role, created_at: datetime.now().isoformat() } self._save_users() return True, 用户添加成功 def authenticate(self, username: str, password: str) - bool: 验证用户 if username not in self.users: return False stored_hash self.users[username][password_hash] input_hash self.hash_password(password) return stored_hash input_hash # 初始化用户管理器 user_manager UserManager() # 初始化时添加管理员用户仅第一次运行 if not os.path.exists(users.json): user_manager.add_user(admin, AdminPass123!, admin) user_manager.add_user(user1, User1Pass456!, user) # 自定义认证函数 def gradio_auth(username: str, password: str): Gradio认证函数 return user_manager.authenticate(username, password) # 加载模型 tokenizer AutoTokenizer.from_pretrained(THUDM/chatglm-6b, trust_remote_codeTrue) model AutoModel.from_pretrained(THUDM/chatglm-6b, trust_remote_codeTrue).half().cuda() def chat(message, history): response, history model.chat(tokenizer, message, historyhistory) return response demo gr.ChatInterface(fnchat) if __name__ __main__: demo.launch( server_name127.0.0.1, server_port8786, shareFalse, authgradio_auth, auth_message请输入用户名和密码 )用户管理脚本 创建manage_users.py来管理用户#!/usr/bin/env python3 import sys from app import user_manager # 从主程序导入 def main(): if len(sys.argv) 4: print(用法: python manage_users.py [add|delete|list] [username] [password]) return action sys.argv[1] username sys.argv[2] if action add: if len(sys.argv) 4: print(需要密码参数) return password sys.argv[3] success, message user_manager.add_user(username, password) print(message) elif action delete: if username in user_manager.users: del user_manager.users[username] user_manager._save_users() print(f用户 {username} 已删除) else: print(用户不存在) elif action list: for user, info in user_manager.users.items(): print(f{user}: {info[role]}) else: print(未知操作) if __name__ __main__: main()使用示例# 添加用户 python manage_users.py add alice AlicePass123! # 列出所有用户 python manage_users.py list # 删除用户 python manage_users.py delete alice5. 高级防护API密钥与速率限制对于生产环境或需要对外提供API服务的场景我们需要更专业的防护措施。5.1 API密钥认证首先我们实现一个API密钥系统import os import secrets import json from datetime import datetime, timedelta from functools import wraps from flask import Flask, request, jsonify import gradio as gr from transformers import AutoTokenizer, AutoModel # 创建Flask应用包装Gradio app Flask(__name__) # API密钥存储 API_KEYS_FILE api_keys.json def load_api_keys(): 加载API密钥 if os.path.exists(API_KEYS_FILE): with open(API_KEYS_FILE, r) as f: return json.load(f) return {} def save_api_keys(keys): 保存API密钥 with open(API_KEYS_FILE, w) as f: json.dump(keys, f, indent2) def generate_api_key(name: str, expires_days: int 30) - str: 生成新的API密钥 api_keys load_api_keys() # 生成随机密钥 key secrets.token_urlsafe(32) # 设置过期时间 expires (datetime.now() timedelta(daysexpires_days)).isoformat() api_keys[key] { name: name, created_at: datetime.now().isoformat(), expires_at: expires, is_active: True, usage_count: 0 } save_api_keys(api_keys) return key def validate_api_key(key: str) - bool: 验证API密钥 api_keys load_api_keys() if key not in api_keys: return False key_info api_keys[key] # 检查是否激活 if not key_info[is_active]: return False # 检查是否过期 expires_at datetime.fromisoformat(key_info[expires_at]) if datetime.now() expires_at: return False # 更新使用计数 key_info[usage_count] 1 save_api_keys(api_keys) return True def require_api_key(f): API密钥验证装饰器 wraps(f) def decorated_function(*args, **kwargs): api_key request.headers.get(X-API-Key) or request.args.get(api_key) if not api_key or not validate_api_key(api_key): return jsonify({ error: 无效或过期的API密钥, code: 401 }), 401 return f(*args, **kwargs) return decorated_function # 加载模型 tokenizer AutoTokenizer.from_pretrained(THUDM/chatglm-6b, trust_remote_codeTrue) model AutoModel.from_pretrained(THUDM/chatglm-6b, trust_remote_codeTrue).half().cuda() # API路由 app.route(/api/chat, methods[POST]) require_api_key def api_chat(): API聊天接口 data request.json message data.get(message, ) history data.get(history, []) if not message: return jsonify({error: 消息不能为空}), 400 try: response, new_history model.chat(tokenizer, message, historyhistory) return jsonify({ response: response, history: new_history, timestamp: datetime.now().isoformat() }) except Exception as e: return jsonify({error: str(e)}), 500 app.route(/api/health, methods[GET]) def health_check(): 健康检查 return jsonify({ status: healthy, model: ChatGLM-6B, timestamp: datetime.now().isoformat() }) # 管理接口 app.route(/admin/generate-key, methods[POST]) def generate_key(): 生成新的API密钥需要管理员认证 # 这里可以添加管理员认证 data request.json name data.get(name, default) expires_days data.get(expires_days, 30) key generate_api_key(name, expires_days) return jsonify({ api_key: key, name: name, expires_in_days: expires_days }) if __name__ __main__: # 启动Flask应用 app.run(host127.0.0.1, port5000, debugFalse) # 注意Gradio界面可以通过另一个端口提供 # 或者将Gradio集成到Flask中5.2 速率限制为了防止API被滥用我们需要添加速率限制from flask_limiter import Limiter from flask_limiter.util import get_remote_address # 初始化速率限制器 limiter Limiter( appapp, key_funcget_remote_address, # 根据IP限制 default_limits[100 per hour, 10 per minute] # 默认限制 ) # 应用速率限制到API app.route(/api/chat, methods[POST]) limiter.limit(10 per minute) # 每分钟最多10次 require_api_key def api_chat(): # ... 原有代码 ...更精细的速率限制 我们可以根据API密钥进行更精细的控制def get_api_key_from_request(): 从请求中提取API密钥 return request.headers.get(X-API-Key) or request.args.get(api_key) # 根据API密钥类型设置不同限制 app.route(/api/chat, methods[POST]) limiter.limit( lambda: 100 per hour if get_api_key_from_request().startswith(free_) else 1000 per hour, key_funcget_api_key_from_request ) require_api_key def api_chat(): # ... 原有代码 ...5.3 使用Nginx作为反向代理对于生产环境使用Nginx作为反向代理可以提供额外的安全层# /etc/nginx/sites-available/chatglm server { listen 443 ssl; server_name your-domain.com; # SSL配置 ssl_certificate /path/to/your/certificate.crt; ssl_certificate_key /path/to/your/private.key; # 安全头部 add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection 1; modeblock; location / { # 只允许特定IP段访问 allow 192.168.1.0/24; allow 10.0.0.0/8; deny all; # 反向代理到Gradio proxy_pass http://127.0.0.1:8786; # WebSocket支持 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; # 其他代理设置 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 超时设置 proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; } # API端点单独配置 location /api/ { # API特定的速率限制 limit_req zoneapi burst10 nodelay; # 认证头传递 proxy_set_header X-API-Key $http_x_api_key; proxy_pass http://127.0.0.1:5000; # 其他代理设置... } # 健康检查端点 location /health { access_log off; proxy_pass http://127.0.0.1:5000/api/health; } } # 速率限制区域定义 http { limit_req_zone $binary_remote_addr zoneapi:10m rate10r/s; }6. 监控与日志审计安全防护不是一次性的工作需要持续的监控和审计。6.1 增强日志记录修改应用以记录详细的访问日志import logging from datetime import datetime # 配置日志 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(chatglm_access.log), logging.StreamHandler() ] ) logger logging.getLogger(__name__) def log_access(api_key: str None, endpoint: str , status: str success, details: dict None): 记录访问日志 log_data { timestamp: datetime.now().isoformat(), endpoint: endpoint, client_ip: request.remote_addr if request else unknown, user_agent: request.headers.get(User-Agent, ) if request else , api_key: api_key[:8] ... if api_key else none, # 只记录部分密钥 status: status, details: details or {} } logger.info(fAccess: {log_data}) # 同时写入JSON日志文件 with open(api_access.jsonl, a) as f: f.write(json.dumps(log_data) \n) # 在API端点中添加日志 app.route(/api/chat, methods[POST]) limiter.limit(10 per minute) require_api_key def api_chat(): api_key get_api_key_from_request() try: data request.json message data.get(message, ) # 记录请求 log_access( api_keyapi_key, endpoint/api/chat, details{ message_length: len(message), has_history: history in data } ) # 处理请求... response, new_history model.chat(tokenizer, message, historydata.get(history, [])) return jsonify({ response: response, history: new_history }) except Exception as e: # 记录错误 log_access( api_keyapi_key, endpoint/api/chat, statuserror, details{error: str(e)} ) return jsonify({error: str(e)}), 5006.2 异常检测添加简单的异常检测机制import time from collections import defaultdict class AnomalyDetector: def __init__(self): self.request_counts defaultdict(int) self.error_counts defaultdict(int) self.last_reset time.time() self.reset_interval 3600 # 1小时重置一次 def record_request(self, client_ip: str): 记录请求 current_time time.time() # 每小时重置计数 if current_time - self.last_reset self.reset_interval: self.request_counts.clear() self.error_counts.clear() self.last_reset current_time self.request_counts[client_ip] 1 # 检测异常单个IP每分钟超过60次请求 if self.request_counts[client_ip] 60: logger.warning(f异常请求频率: {client_ip} - {self.request_counts[client_ip]}次/小时) return False return True def record_error(self, client_ip: str): 记录错误 self.error_counts[client_ip] 1 # 检测异常单个IP错误率过高 total_requests self.request_counts.get(client_ip, 1) error_rate self.error_counts[client_ip] / total_requests if error_rate 0.5: # 错误率超过50% logger.warning(f高错误率: {client_ip} - {error_rate:.1%}) return False return True # 初始化异常检测器 detector AnomalyDetector() # 在请求处理中添加检测 app.before_request def before_request(): client_ip request.remote_addr if not detector.record_request(client_ip): return jsonify({error: 请求过于频繁}), 429 app.after_request def after_request(response): if response.status_code 400: detector.record_error(request.remote_addr) return response6.3 监控脚本创建监控脚本定期检查服务状态#!/usr/bin/env python3 # monitor.py import requests import json import smtplib from email.mime.text import MIMEText from datetime import datetime, timedelta class ServiceMonitor: def __init__(self, config_filemonitor_config.json): with open(config_file, r) as f: self.config json.load(f) self.alert_cooldown {} def check_service(self): 检查服务状态 checks [] # 检查API健康端点 try: response requests.get( f{self.config[api_url]}/health, timeout5 ) api_healthy response.status_code 200 checks.append((API健康检查, api_healthy, response.text if api_healthy else 服务不可用)) except Exception as e: checks.append((API健康检查, False, str(e))) # 检查Gradio界面 try: response requests.get( self.config[gradio_url], timeout10 ) gradio_accessible response.status_code 200 checks.append((Gradio访问, gradio_accessible, 可访问 if gradio_accessible else f状态码: {response.status_code})) except Exception as e: checks.append((Gradio访问, False, str(e))) # 检查日志文件大小 import os log_file chatglm_access.log if os.path.exists(log_file): size_mb os.path.getsize(log_file) / (1024 * 1024) log_ok size_mb 100 # 超过100MB报警 checks.append((日志文件大小, log_ok, f{size_mb:.1f}MB)) else: checks.append((日志文件, False, 日志文件不存在)) return checks def send_alert(self, failed_checks): 发送警报 if not self.config.get(alert_email): return # 冷却期检查避免频繁报警 last_alert self.alert_cooldown.get(tuple(failed_checks), None) if last_alert and (datetime.now() - last_alert) timedelta(hours1): return # 构建邮件内容 subject f[警报] ChatGLM-6B服务异常 - {datetime.now().strftime(%Y-%m-%d %H:%M)} body 以下检查失败\n\n for check_name, _, message in failed_checks: body f• {check_name}: {message}\n body f\n检查时间: {datetime.now().isoformat()} # 发送邮件 try: msg MIMEText(body) msg[Subject] subject msg[From] self.config[smtp_from] msg[To] self.config[alert_email] with smtplib.SMTP(self.config[smtp_server], self.config[smtp_port]) as server: server.starttls() server.login(self.config[smtp_user], self.config[smtp_password]) server.send_message(msg) print(f警报已发送: {subject}) self.alert_cooldown[tuple(failed_checks)] datetime.now() except Exception as e: print(f发送警报失败: {e}) def run(self): 运行监控 print(f开始检查服务状态: {datetime.now().isoformat()}) checks self.check_service() failed_checks [(name, status, msg) for name, status, msg in checks if not status] # 输出结果 for name, status, msg in checks: status_str ✓ if status else ✗ print(f{status_str} {name}: {msg}) # 如果有失败项发送警报 if failed_checks: print(f\n发现 {len(failed_checks)} 个问题) self.send_alert(failed_checks) else: print(\n所有检查通过) if __name__ __main__: monitor ServiceMonitor() monitor.run()配置monitor_config.json{ api_url: http://127.0.0.1:5000, gradio_url: http://127.0.0.1:8786, alert_email: your-emailexample.com, smtp_server: smtp.example.com, smtp_port: 587, smtp_user: your-emailexample.com, smtp_password: your-password, smtp_from: monitoryour-domain.com }设置定时任务crontab# 每5分钟检查一次 */5 * * * * /usr/bin/python3 /path/to/monitor.py /var/log/chatglm_monitor.log 217. 总结通过本文的层层递进我们为ChatGLM-6B服务构建了一个完整的安全防护体系。让我们回顾一下关键要点7.1 安全防护层次总结第一层网络层防护修改默认端口避开自动化扫描配置防火墙只允许可信IP访问使用SSH隧道确保传输加密第二层应用层防护添加Gradio基础认证防止未授权访问使用环境变量管理敏感信息避免硬编码实现多用户系统支持团队协作第三层API级防护实现API密钥认证适合程序化访问添加速率限制防止资源滥用使用反向代理Nginx提供额外安全层第四层监控与审计详细记录访问日志便于问题追踪实现异常检测自动识别可疑行为设置监控告警及时发现服务异常7.2 实践建议根据你的使用场景可以选择不同的防护组合个人开发使用修改默认端口 SSH隧道 基础认证简单有效配置快速小团队内部使用防火墙IP限制 多用户认证 基础监控平衡安全性与便利性对外提供API服务API密钥系统 速率限制 Nginx反向代理 完整监控生产级安全防护7.3 持续安全维护安全不是一次性的工作需要持续维护定期更新保持系统、Python包、模型权重更新到最新版本定期审计检查日志分析访问模式识别异常定期更换定期更换密码和API密钥备份恢复定期备份配置和用户数据制定恢复计划安全测试定期进行安全测试检查防护措施的有效性7.4 最后的话为ChatGLM-6B添加安全防护可能看起来有些复杂但每一步都是值得的。从最简单的端口修改开始逐步添加更多防护层你会发现服务运行更加稳定使用更加安心。记住安全防护的核心思想是纵深防御——不要依赖单一防护措施而是建立多层次的防护体系。即使某一层被突破还有其他层提供保护。现在你可以根据实际需求选择适合的防护措施让你的ChatGLM-6B服务既强大又安全。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。