MindSearch 部署到Github Codespace 和 Hugging Face Space

打开codespace主页,选择blank template。

浏览器会自动在新的页面打开一个web版的vscode。

mkdir -p /workspaces/mindsearch
cd /workspaces/mindsearch
git clone https://github.com/InternLM/MindSearch.git
cd MindSearch && git checkout b832275 && cd ..

创建一个 conda 环境来安装相关依赖

# 创建环境
conda create -n mindsearch python=3.10 -y
# 激活环境
conda activate mindsearch
# 安装依赖
pip install -r /workspaces/mindsearch/MindSearch/requirements.txt

激活环境时报错:CondaError: Run ‘conda init‘ before ‘conda activate‘

解决:conda init --system --all

重新打开新的终端就可以解决。

 获取硅基流动 API Key

因为要使用硅基流动的 API Key,所以接下来便是注册并获取 API Key 了。

首先,我们打开 硅基流动统一登录 来注册硅基流动的账号(如果注册过,则直接登录即可)。

在完成注册后,打开 硅基流动统一登录 来准备 API Key。首先创建新 API 密钥,然后点击密钥进行复制,以备后续使用。

启动 MindSearch

启动后端

由于硅基流动 API 的相关配置已经集成在了 MindSearch 中,所以我们可以直接执行下面的代码来启动 MindSearch 的后端。

#=复制的密钥
export SILICON_API_KEY=sk-bbkxwcvonmrnzmvujeuesrtdnveweabzvkohqjkyaganlsdn
conda activate mindsearch
cd /workspaces/mindsearch/MindSearch
python -m mindsearch.app --lang cn --model_format internlm_silicon --search_engine DuckDuckGoSearch

启动前端

在后端启动完成后,我们打开新终端运行如下命令来启动 MindSearch 的前端。

conda activate mindsearch
cd /workspaces/mindsearch/MindSearch
python frontend/mindsearch_gradio.py

部署到 HuggingFace Space

最后,我们来将 MindSearch 部署到 HuggingFace Space。

我们首先打开 https://huggingface.co/spaces ,并点击 Create new Space,如下图所示。

最后,我们先新建一个目录,准备提交到 HuggingFace Space 的全部文件。

# 创建新目录
mkdir -p /workspaces/mindsearch/mindsearch_deploy
# 准备复制文件
cd /workspaces/mindsearch
cp -r /workspaces/mindsearch/MindSearch/mindsearch /workspaces/mindsearch/mindsearch_deploy
cp /workspaces/mindsearch/MindSearch/requirements.txt /workspaces/mindsearch/mindsearch_deploy
# 创建 app.py 作为程序入口
touch /workspaces/mindsearch/mindsearch_deploy/app.py
import json
import os

import gradio as gr
import requests
from lagent.schema import AgentStatusCode

os.system("python -m mindsearch.app --lang cn --model_format internlm_silicon &")

PLANNER_HISTORY = []
SEARCHER_HISTORY = []


def rst_mem(history_planner: list, history_searcher: list):
    '''
    Reset the chatbot memory.
    '''
    history_planner = []
    history_searcher = []
    if PLANNER_HISTORY:
        PLANNER_HISTORY.clear()
    return history_planner, history_searcher


def format_response(gr_history, agent_return):
    if agent_return['state'] in [
            AgentStatusCode.STREAM_ING, AgentStatusCode.ANSWER_ING
    ]:
        gr_history[-1][1] = agent_return['response']
    elif agent_return['state'] == AgentStatusCode.PLUGIN_START:
        thought = gr_history[-1][1].split('```')[0]
        if agent_return['response'].startswith('```'):
            gr_history[-1][1] = thought + '\n' + agent_return['response']
    elif agent_return['state'] == AgentStatusCode.PLUGIN_END:
        thought = gr_history[-1][1].split('```')[0]
        if isinstance(agent_return['response'], dict):
            gr_history[-1][
                1] = thought + '\n' + f'```json\n{json.dumps(agent_return["response"], ensure_ascii=False, indent=4)}\n```'  # noqa: E501
    elif agent_return['state'] == AgentStatusCode.PLUGIN_RETURN:
        assert agent_return['inner_steps'][-1]['role'] == 'environment'
        item = agent_return['inner_steps'][-1]
        gr_history.append([
            None,
            f"```json\n{json.dumps(item['content'], ensure_ascii=False, indent=4)}\n```"
        ])
        gr_history.append([None, ''])
    return


def predict(history_planner, history_searcher):

    def streaming(raw_response):
        for chunk in raw_response.iter_lines(chunk_size=8192,
                                             decode_unicode=False,
                                             delimiter=b'\n'):
            if chunk:
                decoded = chunk.decode('utf-8')
                if decoded == '\r':
                    continue
                if decoded[:6] == 'data: ':
                    decoded = decoded[6:]
                elif decoded.startswith(': ping - '):
                    continue
                response = json.loads(decoded)
                yield (response['response'], response['current_node'])

    global PLANNER_HISTORY
    PLANNER_HISTORY.append(dict(role='user', content=history_planner[-1][0]))
    new_search_turn = True

    url = 'http://localhost:8002/solve'
    headers = {'Content-Type': 'application/json'}
    data = {'inputs': PLANNER_HISTORY}
    raw_response = requests.post(url,
                                 headers=headers,
                                 data=json.dumps(data),
                                 timeout=20,
                                 stream=True)

    for resp in streaming(raw_response):
        agent_return, node_name = resp
        if node_name:
            if node_name in ['root', 'response']:
                continue
            agent_return = agent_return['nodes'][node_name]['detail']
            if new_search_turn:
                history_searcher.append([agent_return['content'], ''])
                new_search_turn = False
            format_response(history_searcher, agent_return)
            if agent_return['state'] == AgentStatusCode.END:
                new_search_turn = True
            yield history_planner, history_searcher
        else:
            new_search_turn = True
            format_response(history_planner, agent_return)
            if agent_return['state'] == AgentStatusCode.END:
                PLANNER_HISTORY = agent_return['inner_steps']
            yield history_planner, history_searcher
    return history_planner, history_searcher


with gr.Blocks() as demo:
    gr.HTML("""<h1 align="center">MindSearch Gradio Demo</h1>""")
    gr.HTML("""<p style="text-align: center; font-family: Arial, sans-serif;">MindSearch is an open-source AI Search Engine Framework with Perplexity.ai Pro performance. You can deploy your own Perplexity.ai-style search engine using either closed-source LLMs (GPT, Claude) or open-source LLMs (InternLM2.5-7b-chat).</p>""")
    gr.HTML("""
    <div style="text-align: center; font-size: 16px;">
        <a href="https://github.com/InternLM/MindSearch" style="margin-right: 15px; text-decoration: none; color: #4A90E2;">🔗 GitHub</a>
        <a href="https://arxiv.org/abs/2407.20183" style="margin-right: 15px; text-decoration: none; color: #4A90E2;">📄 Arxiv</a>
        <a href="https://huggingface.co/papers/2407.20183" style="margin-right: 15px; text-decoration: none; color: #4A90E2;">📚 Hugging Face Papers</a>
        <a href="https://huggingface.co/spaces/internlm/MindSearch" style="text-decoration: none; color: #4A90E2;">🤗 Hugging Face Demo</a>
    </div>
    """)
    with gr.Row():
        with gr.Column(scale=10):
            with gr.Row():
                with gr.Column():
                    planner = gr.Chatbot(label='planner',
                                         height=700,
                                         show_label=True,
                                         show_copy_button=True,
                                         bubble_full_width=False,
                                         render_markdown=True)
                with gr.Column():
                    searcher = gr.Chatbot(label='searcher',
                                          height=700,
                                          show_label=True,
                                          show_copy_button=True,
                                          bubble_full_width=False,
                                          render_markdown=True)
            with gr.Row():
                user_input = gr.Textbox(show_label=False,
                                        placeholder='帮我搜索一下 InternLM 开源体系',
                                        lines=5,
                                        container=False)
            with gr.Row():
                with gr.Column(scale=2):
                    submitBtn = gr.Button('Submit')
                with gr.Column(scale=1, min_width=20):
                    emptyBtn = gr.Button('Clear History')

    def user(query, history):
        return '', history + [[query, '']]

    submitBtn.click(user, [user_input, planner], [user_input, planner],
                    queue=False).then(predict, [planner, searcher],
                                      [planner, searcher])
    emptyBtn.click(rst_mem, [planner, searcher], [planner, searcher],
                   queue=False)

demo.queue()
demo.launch(server_name='0.0.0.0',
            server_port=7860,
            inbrowser=True,
            share=True)

在最后,将 /root/mindsearch/mindsearch_deploy 目录下的文件(使用 git)提交到 HuggingFace Space 即可完成部署了。将代码提交到huggingface space的流程如下:

首先创建一个有写权限的token。

然后从huggingface把空的代码仓库clone到codespace。

cd /workspaces/codespaces-blank
git clone https://huggingface.co/spaces/cyq121/mindsearchqq 
# 把token挂到仓库上,让自己有写权限
git remote set-url space https://cyq121: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@huggingface.co/spaces/cyq121/mindsearchqq

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
git remote set-url space https://cyq121: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@huggingface.co/spaces/cyq121/mindsearchqq

报错:Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).

解决:git init

报错:error: No such remote 'space'

解决:git remote -v   #如果没有任何反应表示需要添加

          git remote add space https://huggingface.co/spaces/cyq121/mindsearchqq

上面图片操作可略去,终端运行下面命令:

git remote set-url space https://cyq121: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@huggingface.co/spaces/cyq121/mindsearchqq

cd mindsearchqq
# 把刚才准备的文件都copy进来
cp /workspaces/mindsearch /workspaces/codespaces-blank/

1、配置用户信息

git config --global user.name [username]

git config --global user.email [email]

2、查询用户信息

git config --list

3、如果push遇到在输入密码是输错后,就会报这个错误fatal: Authentication failed for

解决办法:

git config --system --unset credential.helper

Linux中使用cp命令报cp:omitting directory错误

解决措施:cp -r 文件路径 目的路径

主要原因分析:要复制的文件下有子目录

https://blog.csdn.net/qq_33039859/article/details/139390796

git remote set-url origin https://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@huggingface.co/cyq121/my-new-model/

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以将 Flask 项目部署GitHub Pages 或者使用 GitHub Actions 自动部署到服务器。 方法一:部署GitHub Pages 1. 在 GitHub 上创建一个新的 repository。 2. 在本地创建一个 Flask 项目,并将其推送到 GitHub repository。 3. 在项目根目录下创建一个名为 `docs` 的文件夹,并在其中创建一个名为 `index.html` 的文件。此文件将作为 GitHub Pages 的主页。 4. 在项目根目录下创建一个名为 `.github/workflows` 的文件夹,并在其中创建一个名为 `deploy.yml` 的文件。此文件将自动部署项目到 GitHub Pages。 5. 在 `deploy.yml` 文件中添加以下代码: ```yaml name: Deploy on: push: branches: - main jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 - name: Setup Python uses: actions/setup-python@v2 with: python-version: '3.x' - name: Install dependencies run: pip install -r requirements.txt - name: Build static files run: | export FLASK_APP=app.py flask build - name: Deploy to GitHub Pages uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./docs ``` 6. 推送代码到 GitHub repository,GitHub Actions 将自动部署项目到 GitHub Pages。 方法二:使用 GitHub Actions 自动部署到服务器 1. 在 GitHub 上创建一个新的 repository。 2. 在本地创建一个 Flask 项目,并将其推送到 GitHub repository。 3. 在服务器上安装 Docker 和 Docker Compose。 4. 在项目根目录下创建一个名为 `.github/workflows` 的文件夹,并在其中创建一个名为 `deploy.yml` 的文件。此文件将自动部署项目到服务器。 5. 在 `deploy.yml` 文件中添加以下代码: ```yaml name: Deploy on: push: branches: - main jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 - name: Setup Python uses: actions/setup-python@v2 with: python-version: '3.x' - name: Install dependencies run: pip install -r requirements.txt - name: Build static files run: | export FLASK_APP=app.py flask build - name: Build Docker image run: | docker-compose build - name: Push Docker image to registry uses: docker/build-push-action@v2 with: context: . push: true tags: user/app:${{ github.sha }} env: DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - name: Deploy to server uses: appleboy/ssh-action@master with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} port: ${{ secrets.PORT }} script: | docker-compose pull docker-compose up -d ``` 6. 在项目根目录下创建一个名为 `docker-compose.yml` 的文件,用于定义 Docker 容器。 ```yaml version: '3' services: app: image: user/app:${{ github.sha }} ports: - 80:5000 ``` 7. 在服务器上创建一个名为 `.env` 的文件,并在其中添加以下代码: ```bash FLASK_APP=app.py FLASK_ENV=production SECRET_KEY=<your-secret-key> ``` 8. 在服务器上运行以下命令以启动容器: ```bash docker-compose pull docker-compose up -d ``` GitHub Actions 将自动构建和部署 Docker 容器到服务器上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值