【#第三期实战营闯关作业 ## MindSearch在 Hugging FaceSpace的部署】

news2024/11/13 9:34:55

把MindSearch 部署到Github Codespace后,下一步就是上传到 Hugging Face Space,以下是记录了实操的过程及截图:

  1. 打开 https://huggingface.co/spaces ,并点击 Create new Space,如下图所示:在这里插入图片描述
  2. 在输入 Space name 并选择 License 后,选择配置如下面截图所示:
    在这里插入图片描述
    3 进入 Settings,配置硅基流动的 API Key。如下面截图所示:
    在这里插入图片描述
    4 点击 New secrets,就会弹出一个界面:
    name 一栏输入 SILICON_API_KEY,value 一栏输入你的 API Key 的内容,然后点击“save”就ok了.
    在这里插入图片描述
    5 新建一个目录,以备存放提交到 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)


6 将 /root/mindsearch/mindsearch_deploy 目录下的文件用 git提交到 HuggingFace Space 即可完成部署了。

7 提交到huggingface space的流程如下:
7.1创建一个有写权限的token:, 如下截图所示:
在这里插入图片描述
cd /workspaces/codespaces-blank
git clone https://huggingface.co/spaces/<你的名字>/<仓库名称>

把token挂到仓库上,让自己有写权限

git remote set-url space https://<你的名字>:<上面创建的token>@huggingface.co/spaces/<你的名字>/<仓库名称>
或者用ssh连结git remote set-url origin git@hf.co<你的名字>::/<仓库名称>

cd <仓库名称>

把刚才准备的文件都copy进来

cp -r /workspaces/mindsearch/mindsearch_deploy/* .

在这里插入图片描述
文件目录截图是这样
最后把代码提交到huggingface space会自动启动项目。
git add .
git commit -m “update”
git push
在这里插入图片描述这是部署huggingface space上的截图
请佬们指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2095662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据仓库系列18:如何建立一个有效的元数据管理体系?

目录 什么是元数据?为什么它如此重要?元数据管理体系的核心组件如何设计元数据模型步骤1: 识别关键元数据类型步骤2: 定义元数据属性步骤3: 建立元数据之间的关系步骤4: 选择合适的建模方法示例: 使用关系模型设计元数据模型最佳实践 元数据采集策略1. 识别元数据来源2. 自动…

正则表达式pattern

String qq "1234567890" qq.matches("[1-9]\\d{5,19}") [1-9]第一位不等于零 \\d都是数字 {5,19}后面的5到19位。 正则表达式的作用 作用1&#xff1a;校验字符串是否满足规则 作用2&#xff1a;在一段文本中查找满足要求的内容 sout("\"…

Cesium 地球云图

Cesium 地球云图 使用自定义图原(Primitive)实现。 支持速度和透明的动态调整。 支持设置云图高度, 当相机高度小于云图高度时, 渐隐消失。 Cesium 地球云图

Qt-初始Qt

1. Qt背景介绍 1.1 什么是Qt Qt是⼀个跨平台的C图形⽤⼾界⾯应⽤程序框架。它为应⽤程序开发者提供了建⽴艺术级图形界⾯所需的所有功能。它是完全⾯向对象的&#xff0c;很容易扩展。Qt为开发者提供了⼀种基于组件的开发模式&#xff0c;开发者可以通过简单的拖拽和组合来实现…

003.精读《MapReduce: Simplified Data Processing on Large Clusters》

文章目录 1. 引言&#xff1a;2. 精读2.1 背景2.2 模型应用2.3 基本原理2.4 其他 3. 总结 1. 引言&#xff1a; 在本期的精读会中&#xff0c;我们将深入探讨一篇具有里程碑意义的论文——《MapReduce: Simplified Data Processing on Large Clusters》。这篇论文不仅奠定了大…

【AI音频处理】:重塑声音世界的无限可能

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 引言一、语音识别&#xff1a;人机交互的新篇章二、语音合成&#xff1a;让机器“说话”的艺术三、音乐创作与推荐&#xff1a;AI赋予音乐新生命四、声音效果处理&#xff1a;让声音更加完美五、AI在…

浅谈维度建模、数据分析模型,何为数据仓库,与数据库的区别

往期推荐 大数据HBase图文简介-CSDN博客 数仓分层ODS、DWD、DWM、DWS、DIM、DM、ADS-CSDN博客 数仓常见名词解析和名词之间的关系-CSDN博客 数仓架构&#xff1a;离线数仓、实时数仓Lambda和Kappa、湖仓一体数据湖-CSDN博客 0. 前言 1991年&#xff0c;数据仓库之父 比尔恩门 著…

【C++ | 设计模式】代理模式的详解与实现

1. 概念 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;用于控制对对象的访问。它通过引入代理对象&#xff0c;间接地操作目标对象&#xff0c;从而实现对目标对象的控制。代理模式的核心思想是通过代理对象来控制对目标对象的访问。代理对…

坐标系的那些事儿

哈喽&#xff0c;大家好&#xff01;地理坐标系、投影坐标系等知识是地图学、GIS和地图发布、应用等绕不开的话题&#xff0c;今天我们一起聊一聊坐标系的那些事儿&#xff01; 1.地理坐标系 为了确定地面点在地球椭球体表面位置而定义的空间参考系&#xff0c;主要用经纬度来…

软件设计师笔记-多媒体基础知识

媒体 感觉媒体&#xff08;使人产生感觉的媒体&#xff09;表示媒体&#xff08;传输感觉媒体的中介媒体&#xff09;表现媒体&#xff08;进行信息输入和输出的媒体&#xff09;存储媒体&#xff08;用于存储表示媒体的物理介质&#xff09;传输媒体&#xff08;传输表示媒体…

酿酒师的匠心独运:白酒酿造的不同工艺

在华夏大地的深处&#xff0c;一群酿酒师用他们的匠心独运&#xff0c;将大自然的馈赠转化为琼浆玉液&#xff0c;那便是豪迈白酒&#xff08;HOMANLISM&#xff09;。每一滴酒液都承载着酿酒师们的智慧和汗水&#xff0c;每一瓶豪迈白酒&#xff08;HOMANLISM&#xff09;都是…

Disjoint-set data structure--并查集

Disjoint-set data structure 不相交集, 通常称作并查集的一种数据结构。 应用范围&#xff1a;处理不相交集合的合并查询问题&#xff0c;它在处理这两种的时间复杂度在实际应用上往往认为是 O ( 1 ) O(1) O(1),稍后本篇会略加说明。接受两种操作&#xff1a;判断两元素是否…

【进程间通信】管道应用场景---简易进程池

#include<iostream> #include<vector> #include<string> #include<cstring> #include<cstdlib> #include<unistd.h> #include<sys/stat.h> #include<sys/wait.h>//把5个子进程要管理起来&#xff0c;要先描述再组织 const int…

SPI驱动学习二(驱动框架)

目录 一、回顾平台总线设备驱动模型二、SPI设备驱动1. 数据结构1.1 SPI控制器数据结构1.2 SPI设备数据结构1.3 SPI设备驱动 2. SPI驱动框架2.1 SPI控制器驱动程序2.2 SPI设备驱动程序 三、SPI设备树处理过程1. SPI Master2. SPI Device3. 设备树示例4. 设备树实例4.1 使用GPIO模…

leetcode 899. Orderly Queue

原题链接 You are given a string s and an integer k. You can choose one of the first k letters of s and append it at the end of the string. Return the lexicographically smallest string you could have after applying the mentioned step any number of moves. …

Java集合类之Collection

文章目录 1 准备部分1.1 数据结构1.1.1 数组1.1.2 链表 1.2 集合是什么 2 Collection2.1 特点2.2 常用API2.3 遍历Collection的方法2.3.1 toArray方法2.2.2 iterator方法2.3.3 foreach2.3.4 总结 3 List 接口3.1 内容提要3.2 特点3.3 List的API3.3.1 listIterator方法3.3.4 sub…

【RabbitMQ应用篇】常见应用问题

1. 消息幂等性保障 1.1 幂等性介绍 幂等性&#xff1a;这个概念在数学和计算机领域中相当常见&#xff0c;表示可以被应用多次但是不会改变初始应用结果的性质。 应用程序的幂等性&#xff1a;指的是在一个应用系统中&#xff0c;重复调用多次请求&#xff08;相同参数&#…

【Python机器学习】神经网络的组成

目录 感知机 数字感知机 认识偏置 Python版神经元 “课堂时间” 有趣的逻辑学习问题 下一步 代价函数 反向传播算法 求导 误差曲面 不同类型的误差曲面 多种梯度下降算法 Keras&#xff1a;用Python实现神经网络 展望 归一化&#xff1a;格式化输入 神经网络对…

C语言 面向对象编程

注意事项 在使用面向对象编程的时候&#xff0c;我们得问自己&#xff1a;任务中有什么对象&#xff0c;对象应该怎么使用 项目中文档体系 我们可以规划一下任务得文档&#xff0c;可以为每一个对象的类单独编写源码&#xff0c;并发布对应的头文件作为接口&#xff0c;主控…

Android CCodec Codec2 (六)C2InterfaceHelper

通过前面几篇文章的学习&#xff0c;我们知道了Codec2参数结构&#xff0c;以及如何定义一个Codec2参数。接下来的几篇文章我们将简单了解上层是如何请求组件支持的参数、如何配置参数&#xff0c;以及参数是如何反射给上层的。本篇文章我们将了解接口参数实例化。 1、C2Interf…