Compare commits

...

3 Commits

Author SHA1 Message Date
1Dreamer666 38d3c0f395
Merge 743420daac into 3f1a7cc25b 2026-06-09 21:44:32 +08:00
jingyaogong 3f1a7cc25b [fix] ddp exit hang 2026-06-01 17:50:39 +08:00
Toward 743420daac [fix] 更新.gitignore文件,添加忽略目录;修改web_demo.py,优化样式和功能 2026-05-10 23:09:26 +08:00
11 changed files with 95 additions and 19 deletions

6
.gitignore vendored
View File

@ -4,3 +4,9 @@ __pycache__/
out
website/
docs-minimind/
checkpoints/
dataset/
minimind-3/
minimind-3-moe/

5
scripts/.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
# .gitignore 忽略下列文件和目录
#比如minimind\scripts\minimind-3和minimind\scripts\minimind-3-moe
minimind-3/
minimind-3-moe/

View File

@ -64,6 +64,28 @@ st.markdown("""
margin: 0 2px !important; /* 调整这里的 margin 值 */
}
/* 单独恢复侧边栏按钮(新建对话)的正常横向长方形外观,避免文字被挤成竖排 */
[data-testid="stSidebar"] .stButton > button {
border-radius: 8px !important; /* 恢复稍微圆角的矩形 */
width: 100% !important; /* 撑满侧边栏宽度 */
height: auto !important;
min-width: 100% !important; /* 覆盖掉 18px 的限制 */
min-height: 40px !important;
max-width: 100% !important;
max-height: none !important;
padding: 8px !important; /* 恢复内边距 */
background-color: #f4f6f8 !important; /* 增加一点按钮底色以免透明看不清 */
border: 1px solid #e0e0e0 !important;
font-size: 15px !important;
color: #333 !important;
margin: 10px 0 !important;
}
[data-testid="stSidebar"] .stButton > button:hover {
border-color: #999 !important;
background-color: #e4e8f0 !important;
color: #000 !important;
}
</style>
""", unsafe_allow_html=True)
@ -83,6 +105,7 @@ LANG_TEXTS = {
'disclaimer': 'AI 生成内容可能存在错误,请仔细核实',
'think_tip': '自适应思考,目前多轮对话或Tool Call共存时思考不稳定',
'tool_select': '工具选择(最多4个)',
'new_chat': '新建对话', # 新增
},
'en': {
'settings': 'Model Settings',
@ -96,6 +119,7 @@ LANG_TEXTS = {
'disclaimer': 'AI-generated content may be inaccurate, please verify',
'think_tip': 'Adaptive thinking; may be unstable with multi-turn or Tool Call',
'tool_select': 'Tool Selection (max 4)',
'new_chat': 'New Chat', # 新增
}
}
@ -237,15 +261,20 @@ def regenerate_answer(index):
# 动态扫描模型目录
@st.cache_data(ttl=3600) # 增加缓存(有效期1小时),避免每次刷新页面都去高频读取硬盘文件树
def get_model_paths():
script_dir = os.path.dirname(os.path.abspath(__file__))
MODEL_PATHS = {}
paths = {}
for d in sorted(os.listdir(script_dir), reverse=True):
full_path = os.path.join(script_dir, d)
if os.path.isdir(full_path) and not d.startswith('.') and not d.startswith('_'):
if any(f.endswith(('.bin', '.safetensors', '.pt')) or os.path.exists(os.path.join(full_path, 'model.safetensors.index.json')) for f in os.listdir(full_path) if os.path.isfile(os.path.join(full_path, f))):
MODEL_PATHS[d] = [d, d]
if not MODEL_PATHS:
MODEL_PATHS = {"No models found": ["", "No models"]}
paths[d] =[d, d]
if not paths:
paths = {"No models found": ["", "No models"]}
return paths
MODEL_PATHS = get_model_paths()
# 模型选择
selected_model = st.sidebar.selectbox('Model', list(MODEL_PATHS.keys()), index=0)
@ -285,7 +314,27 @@ with st.sidebar.expander(get_text('tools')):
if checked and len(st.session_state.selected_tools) < 4:
st.session_state.selected_tools.append(name)
image_url = "https://www.modelscope.cn/api/v1/studio/gongjy/MiniMind/repo?Revision=master&FilePath=images%2Flogo2.png&View=true"
# 新建对话
st.sidebar.markdown('<hr style="margin: 12px 0 16px 0;">', unsafe_allow_html=True)
# 新建对话
if st.sidebar.button(get_text('new_chat'), key="new_chat", use_container_width=True):
clear_chat_messages()
st.rerun()
# 将外部网络图片改为读取本地图片转 base64 渲染
import base64
@st.cache_data
def get_image_base64(image_path):
try:
with open(image_path, "rb") as img_file:
return f"data:image/png;base64,{base64.b64encode(img_file.read()).decode()}"
except:
# 如果本地图片不存在,再退回使用网络URL
return "https://www.modelscope.cn/api/v1/studio/gongjy/MiniMind/repo?Revision=master&FilePath=images%2Flogo2.png&View=true"
local_logo_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "images", "logo2.png")
image_url = get_image_base64(local_logo_path)
st.markdown(
f'<div style="display: flex; flex-direction: column; align-items: center; text-align: center; margin: 0; padding: 0;">'

View File

@ -487,4 +487,6 @@ if __name__ == "__main__":
else:
rl_train_epoch(epoch, loader, len(loader), rollout_engine, ref_model, reward_model, 0, wandb, use_sglang = (args.rollout_engine == "sglang"))
if dist.is_initialized(): dist.destroy_process_group()
if dist.is_initialized():
dist.barrier()
dist.destroy_process_group()

View File

@ -243,4 +243,6 @@ if __name__ == "__main__":
train_epoch(epoch, loader, len(loader), teacher_model, lm_config_student, 0, wandb, args.alpha, args.temperature)
# ========== 9. 清理分布进程 ==========
if dist.is_initialized(): dist.destroy_process_group()
if dist.is_initialized():
dist.barrier()
dist.destroy_process_group()

View File

@ -223,4 +223,6 @@ if __name__ == "__main__":
train_epoch(epoch, loader, len(loader), ref_model, lm_config, 0, wandb, args.beta)
# ========== 9. 清理分布进程 ==========
if dist.is_initialized(): dist.destroy_process_group()
if dist.is_initialized():
dist.barrier()
dist.destroy_process_group()

View File

@ -168,4 +168,6 @@ if __name__ == "__main__":
train_epoch(epoch, loader, len(loader), 0, wandb)
# ========== 9. 清理分布进程 ==========
if dist.is_initialized(): dist.destroy_process_group()
if dist.is_initialized():
dist.barrier()
dist.destroy_process_group()

View File

@ -329,4 +329,6 @@ if __name__ == "__main__":
grpo_train_epoch(epoch, loader, len(loader), rollout_engine, ref_model, reward_model, 0, wandb, use_sglang = (args.rollout_engine == "sglang"))
# ========== 9. 清理分布进程 ==========
if dist.is_initialized(): dist.destroy_process_group()
if dist.is_initialized():
dist.barrier()
dist.destroy_process_group()

View File

@ -181,4 +181,6 @@ if __name__ == "__main__":
train_epoch(epoch, loader, len(loader), lora_params, 0, wandb)
# ========== 10. 清理分布进程 ==========
if dist.is_initialized(): dist.destroy_process_group()
if dist.is_initialized():
dist.barrier()
dist.destroy_process_group()

View File

@ -432,4 +432,6 @@ if __name__ == "__main__":
ppo_train_epoch(epoch, loader, len(loader), rollout_engine, ref_model, actor_scheduler, critic_scheduler, reward_model, 0, wandb, use_sglang = (args.rollout_engine == "sglang"))
# ========== 9. 清理分布进程 ==========
if dist.is_initialized(): dist.destroy_process_group()
if dist.is_initialized():
dist.barrier()
dist.destroy_process_group()

View File

@ -167,4 +167,6 @@ if __name__ == "__main__":
train_epoch(epoch, loader, len(loader), 0, wandb)
# ========== 9. 清理分布进程 ==========
if dist.is_initialized(): dist.destroy_process_group()
if dist.is_initialized():
dist.barrier()
dist.destroy_process_group()