• [课程学习] wtdbg源码字节对齐检查
    执行字节对齐检查登录鲲鹏DevKit工具,选择“亲和分析 > 字节对齐检查”。单击“开始检查”,检查完成后会自动跳转至报告页面,单击需要修改文件的“查看建议源码”, 进入源码修改建议界面,“wtdbg2-2.5/dbgcns.h”文件修改建议如图2所示。根据报告中展示的结构变量内存空间分配结果,对源代码进行字节对齐修改。首先根据字节对齐检查结果,定位具体问题点,如下图所示。根据字节对齐检查结果,在本地对“wtdbg2-2.5/dbgcns.h”文件进行字节对齐修改。调整变量hz和kmask的位置,如下图所示。经过字节对齐处理后,再进行一次字节对齐检查,检查结果如下图所示,检查结果中显示调整后的DBG结构体64位下已不存在内存空洞。调整变量hz和kmask的位置,如下图所示。
  • [课程学习] ExaGear for Server on Cent OS
    运行Ghost系统运行exagear命令,即可启动一个x86 shell(也称为guest shell),进入到虚拟的x86 OS环境。exagear显示:Starting /bin/bash in the guest image /opt/exagear/images/centos-<os_version>-x86_64执行arch命令查看当前环境架构:arch显示:x86_64至此,你已置身于x86运行环境,根目录在host系统上的绝对路径为:/opt/exagear/images/centos-<os_version>-x86_64。在这里,guest shell的运行情况和在x86机器上一样。须知:用户账号在host系统和guest系统之间是共享的。在guest系统中增加或删除用户时,host上也会自动进行相应的修改。/home目录也在host系统和guest系统之间共享(更多host和guest系统之间共享目录的详细信息,请参考“配置ExaGear for Server on CentOS”)。运行exit命令即可退出guest会话。exit 至此,你又回到了host系统。执行如下命令:arch显示:aarch64说明:系统一般默认的是bash shell,调用exagear之前,用户还可以通过设置SHELL环境变量在guest系统中使用自己偏好的shell,比如csh,ksh等。安装 x86 app须知:禁止在同一台机器上同时安装同一服务的x86和Arm版本。另外,强烈建议不要从guest系统中运行host服务,因为这种操作未经测试,也不被支持。x86或x86_64应用程序以及依赖库的安装等,需要在guest环境中进行。推荐使用yum工具安装x86应用,首先要配置yum源,需要进入guest环境后进行配置,相关操作和在x86机器上的操作一样。说明:如果你需要在本地网络中通过/etc/environment使用代理配置,确保你已经通过如下命令将配置复制到了guest系统(更多请参考“配置ExaGear for Server on CentOS”)。sudo cp /etc/environment /opt/exagear/images/centos-<os_version>-x86_64/etc/environment运行exagear命令进入guest环境,以安装x86的nginx为例:exagear显示:Starting /bin/bash in the guest image /opt/exagear/images/centos-<os_version>-x86_64通过yum进行安装:sudo yum update sudo yum install epel-release sudo yum install nginx在guest环境中安装x86应用程序,guest 环境中查看到的路径如果是/path/to/binary,则实际路径是:/opt/exagear/images/centos-<os_version>-x86_64/path/to/binary。比如,在guest环境中 nginx的路径为 /usr/sbin/nginx,在host 环境上的实际路径为/opt/exagear/images/centos-<os_version>-x86_64/usr/sbin/nginx。如果x86应用是以rpm安装包方式提供的,需要将该安装包拷贝至guest系统可见的目录(推荐个人home目录~/),然后进入guest环境,通过yum进行安装。以安装x86 xxx.rpm包为例:exagear显示:Starting /bin/bash in the guest image /opt/exagear/images/centos-<os_version>-x86_64通过yum进行安装:sudo yum install xxx.rpm运行 x86 app更新时间:2025/05/16x86应用程序安装完成后,在guest和host中均可运行。在 Guest Shell 中运行你可以运行exagear命令启动guest shell,并运行任何x86应用程序,运行方式和在x86系统中一样。例如:exagear显示:Starting /bin/bash in the guest image /opt/exagear/images/centos-<os_version>-x86_64然后执行:which nginx显示:/usr/sbin/nginx/usr/sbin/nginx -h在 Host Shell 中运行在host会话中,你有如下两种选择:通过 exagear -- 命令运行:在同一行中输入exagear -- 命令和guest系统内部的x86应用程序路径。例如:exagear -- /usr/sbin/nginx -h通过完整路径运行:输入x86应用程序二进制文件的完整路径。这个文件位于一个特定的目录下:/opt/exagear/images/centos-<os_version>-x86_64(即x86运行环境)。例如:/opt/exagear/images/centos-<os_version>-x86_64/usr/sbin/nginx -h默认配置下,x86应用程序只能访问x86运行环境中的文件。如果需要访问host系统上的某些文件,可以通过设置host与guest共享目录文件方式。详细配置方法请参考“配置ExaGear for Server on CentOS”中的“host系统和guest系统共享的目录”章节。注:对于脚本程序,推荐进入guest环境后运行,或者在host上使用以下命令格式运行:exagear -- /path/to/script以test.sh脚本为例,脚本内容:#!/bin/bash if [ `arch` == 'x86_64' ] then echo "ok" else echo "fail" fi 运行结果对比:直接在host运行:./test.sh显示:fail通过exagear在host运行:exagear -- ./test.sh显示:ok说明:在guest系统中Linux on x86 32位和64位应用程序的安装和运行与在支持多进制的x86计算机上的运行是相同的。配置 ExaGear (CentOS)更新时间:2025/05/16Host系统和Guest系统共享的目录ExaGear for Server整个文件系统对host系统应用程序可见,只有guest系统文件对Linux on x86应用程序可见。图1 Host系统和Guest系统的文件系统 (以CentOS 7为例)配置文件/opt/exagear/images/centos-<os_version>-x86_64/.exagear/vpaths-list包含了host系统和guest系统共享的一系列目录和文件。cat /opt/exagear/images/centos-<os_version>-x86_64/.exagear/vpaths-list显示示例:/home/ /etc/adduser.conf /etc/deluser.conf ... 以下文件及配置会在host系统和guest系统中共享使用:User accountsUser groupsUser privileges/home directoriesHost configurationsSystem information provided by Linux kernelDevices and disksSocketsPidfilesMount pointsLogsTemporary files如需创建一个在host系统和guest系统之间共享的目录或文件,可以选择如下两种方法:方法1:修改vpaths-list配置文件修改vpaths-list配置文件的操作步骤如下:确保host系统中存在所需的目录(或文件)。在guest系统中创建同名的假目录(或文件)。将目录(或文件)的完整路径另取一行添加到配置文件/opt/exagear/images/centos-<os_version>-x86_64/.exagear/vpaths-list中。请注意: 配置文件的目录应以“/”结尾。方法2:将host系统要共享的目录挂载到guest系统以/newdir为例,使用coreutils中的mount实用程序将host系统要共享的目录挂载到guest系统:在x86运行环境中创建挂载点:sudo mkdir /opt/exagear/images/centos-<os_version>-x86_64/shareddir将/newdir挂载到shareddir挂载点下:sudo mount --bind /newdir /opt/exagear/images/centos-<os_version>-x86_64/shareddir说明:在卸载ExaGear for Server前,需要卸载挂载的目录:sudo umount /opt/exagear/images/centos-<os_version>-x86_64/shareddir代理配置/etc/environment在host系统和guest系统之间不共享。因此,如果你需要在本地网络中通过/etc/environment使用代理配置,确保你已经使用如下命令将配置复制到guest系统:sudo cp /etc/environment /opt/exagear/images/centos-<os_version>-x86_64/etc/environmentsysctl和网络配置Guest系统可以访问/proc/sys/中的sysctl设置,但不能修改/etc/sysctl.conf或/etc/sysctl.d/。sysctl参数的配置应在host系统上进行。Guest系统可以访问描述网络配置的文件(例如/etc/resolv.conf)但guest系统不可修改网络设置。网络设置的配置应在host系统上进行。Guest SysV风格的init脚本和systemd在Host中的集成CentOS采用systemd作为init系统,并支持SysV风格的init脚本作为legacy。许多CentOS包中会提供这些服务的配置。默认情况下,系统采用全自动集成机制将guest服务表示为host服务。Guest服务被注册为host服务,服务名称相同。因此,你可以从guest和host shell来管理guest服务(在这种情况下,host服务会将所有start/stop/testconfig等请求委托给各自的guest服务)。以CentOS为例:进入guest环境并安装nginx:exagear显示:Starting /bin/bash in the guest image /opt/exagear/images/centos-<os_version>-x86_64sudo yum update sudo yum install epel-release sudo yum install nginx exit 在host环境管理nginx服务:sudo service nginx start service nginx status显示示例:● nginx.service - nginx - high performance web server Loaded: loaded (/run/systemd/generator.late/nginx.service; generated) Active: active (running) since Fri 2019-05-17 11:56:35 EDT; 2h 54min ago ... 你可以通过列出guest系统的/opt/exagear/images/centos-<os_version>-x86_64/etc/init.d/和/opt/exagear/images/centos-<os_version>-x86_64/lib/systemd/system/目录中的文件来查看guest系统中注册了哪些服务。内存序模型ExaGear for Server 默认为Linux on x86应用程序提供弱内存序模型。如果软件依赖于x86强内存序模型,则可能需要强制ExaGear严格遵循x86强内存序模型。可以通过修改ExaGear for Server配置文件来完成:sudo sed -i -e '/EXAGEAR_SMO_MODE="/s/fbase"/all"/' /etc/exagear-x86_32.conf sudo sed -i -e '/EXAGEAR_SMO_MODE="/s/fbase"/all"/' /etc/exagear-x86_64.conf使用以下命令恢复弱内存序模型:sudo sed -i -e '/EXAGEAR_SMO_MODE="/s/all"/fbase"/' /etc/exagear-x86_32.conf sudo sed -i -e '/EXAGEAR_SMO_MODE="/s/all"/fbase"/' /etc/exagear-x86_64.conf动态二次优化ExaGear 动态二次优化可以在程序翻译运行时动态识别优化的机会,进一步提升翻译效果。动态二次优化依赖硬件SPE功能(SPE是否可用的检测手段查看6-FAQ),以系统服务进程的形式存在。启用动态二次优化需要设置ExaGear配置选项EXAGEAR_USE_OPT="y"。该选项默认为"n"(关闭)。例如:分别在32位和64位应用程序的配置文件/etc/exagear-x86_32.conf 和 /etc/exagear-x86_64.conf中,设置EXAGEAR_USE_OPT="y",以开启动态二次优化。启动动态二次优化服务:sudo systemctl start exagear-x86_64-opt.service sudo systemctl start exagear-x86_32-opt.service查看动态二次优化服务状态:sudo systemctl status exagear-x86_64-opt.service sudo systemctl status exagear-x86_32-opt.service此时可以看到opt.x64a64.socket、opt.x32a64.socket 的进程服务启动。设置/关闭动态二次优化服务自启动:sudo systemctl enable exagear-x86_64-opt.service sudo systemctl disable exagear-x86_64-opt.service sudo systemctl enable exagear-x86_32-opt.service sudo systemctl disable exagear-x86_32-opt.service须知:设置EXAGEAR_USE_OPT="y"之前,请确认exagear-x86_*-opt.service相关进程处于开启状态。返回地址优化ExaGear for Server默认关闭了返回地址优化,相关配置及其值设置为EXAGEAR_DISABLE_NATIVE_RETURN_ADDR_OPT="y"。如需开启返回地址优化,参考以下操作实现:sudo sed -i -e '/EXAGEAR_DISABLE_NATIVE_RETURN_ADDR_OPT="/s/y"/n"/' /etc/exagear-x86_32.conf sudo sed -i -e '/EXAGEAR_DISABLE_NATIVE_RETURN_ADDR_OPT="/s/y"/n"/' /etc/exagear-x86_64.confx86位相同精度在ExaGear中,如果需要以与x86 bit位相同精度进行32/64位的浮点计算(例如,对于使用 SIMD 寄存器的计算),应该启用额外的 ExaGear 选项EXAGEAR_X86_PRECISE_FP。此选项默认为禁用,但可以通过将 EXAGEAR_X86_PRECISE_FP参数设置为 “y”进行开启。例如:在分别针对32位和64位应用程序进行符号链接配置的文件/etc/exagear-x86_32.conf 和 /etc/exagear-x86_64.conf中添加EXAGEAR_X86_PRECISE_FP="y"。说明:启用EXAGEAR_X86_PRECISE_FP选项可能会显著降低ExaGear的整体性能。80位 x86精度在 ExaGear 中,如果需要具有 80 位 x86 精度,则应启用额外的 ExaGear 选项 EXAGEAR_X86_PRECISE_80BIT_FP。此选项默认为禁用,但可以通过将EXAGEAR_X86_PRECISE_80BIT_FP参数设置为“y”进行开启。例如:在分别针对32位和64位应用程序进行符号链接配置的文件/etc/exagear-x86_32.conf 和 /etc/exagear-x86_64.conf中添加EXAGEAR_X86_PRECISE_80BIT_FP="y"。说明:启用EXAGEAR_X86_PRECISE_80BIT_FP选项可能会显著降低ExaGear的整体性能。
  • [问题求助] 【麒麟V10】麒麟V10X86架构安装ambari-2.7.5后,利用ambari构建大数据平台报错RuntimeError: Failed to execute command '/usr/bin/yum -y install hadoo
    麒麟V10X86架构安装ambari-2.7.5后,利用ambari构建大数据平台,报错:2025-05-20 16:49:12,547 - The 'hadoop-hdfs-client' component did not advertise a version. This may indicate a problem with the component packaging.Traceback (most recent call last): File "/var/lib/ambari-agent/cache/stacks/HDP/3.0/services/HDFS/package/scripts/hdfs_client.py", line 78, in <module> HdfsClient().execute() File "/usr/lib/ambari-agent/lib/resource_management/libraries/script/script.py", line 352, in execute method(env) File "/var/lib/ambari-agent/cache/stacks/HDP/3.0/services/HDFS/package/scripts/hdfs_client.py", line 37, in install self.install_packages(env) File "/usr/lib/ambari-agent/lib/resource_management/libraries/script/script.py", line 853, in install_packages retry_count=agent_stack_retry_count) File "/usr/lib/ambari-agent/lib/resource_management/core/base.py", line 166, in __init__ self.env.run() File "/usr/lib/ambari-agent/lib/resource_management/core/environment.py", line 160, in run self.run_action(resource, action) File "/usr/lib/ambari-agent/lib/resource_management/core/environment.py", line 124, in run_action provider_action() File "/usr/lib/ambari-agent/lib/resource_management/core/providers/packaging.py", line 30, in action_install self._pkg_manager.install_package(package_name, self.__create_context()) File "/usr/lib/ambari-agent/lib/ambari_commons/repo_manager/yum_manager.py", line 219, in install_package shell.repository_manager_executor(cmd, self.properties, context) File "/usr/lib/ambari-agent/lib/ambari_commons/shell.py", line 753, in repository_manager_executor raise RuntimeError(message)RuntimeError: Failed to execute command '/usr/bin/yum -y install hadoop_3_1_5_0_152', exited with code '1', message: 'Error: Problem: cannot install the best candidate for the job - nothing provides redhat-lsb needed by hadoop_3_1_5_0_152-3.1.1.3.1.5.0-152.x86_64服务器和ambari版本信息如下截图:求助大佬帮助解决,感谢。
  • [开源for鲲鹏云] 在鲲鹏CPU和HCE系统下部署运行Langchain-chatchat 0.3.1
    资源购买资源名称规格操作系统存储ECS鲲鹏通用计算增强型 km1.xlarge.4 4vCPUs 16GiBHuawei Cloud EulerOS 2.0 标准版 64位 ARM版系统盘:通用型SSD,40GiB安装必要的软件1.安装docker如果之前安装过docker,要先删掉之后再安装依赖sudo dnf remove docker docker-ce-cli docker-selinux docker-engine下载repo文件wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.huaweicloud.com/docker-ce/linux/centos/docker-ce.reposudo sed -i 's+download.docker.com+mirrors.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.reposudo sed -i 's+$releasever+9.9+' /etc/yum.repos.d/docker-ce.repo安装新版本sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin设置开机启动sudo systemctl enable --now docker配置镜像加速器vi /etc/docker/daemon.json# 粘贴以下配置,保存退出,镜像地址可替换成自己在华为云申请的镜像加速器地址{    "registry-mirrors": [ 自己申请的镜像加速地址]}重启dockersystemctl restart docker2.安装condamkdir -p ~/miniconda3wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh -O ~/miniconda3/miniconda.shbash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3rm -f ~/miniconda3/miniconda.shsource ~/miniconda3/bin/activateconda init --all创建虚拟环境conda create -n chat python=3.9 源码下载1.下载langchain-chatchat的源码创建xinference缓存路径mkdir -p ~/xinference下载源码 git clone cid:link_0安装必要的包pip install langchain-chatchat -U -i https://pypi.tuna.tsinghua.edu.cn/simplepip install "langchain-chatchat[xinference]" -U  #安装推理组件xinference 2.初始化项目配置和数据目录export CHATCHAT_ROOT=/root/chatchat_datachatchat init然后在这个目录下就会有相对应的配置文件。model_setting.yaml是模型配置文件,后续需要进行修改。 启动项目1.修改配置文件因为使用的是arm架构进行的部署,xinference的镜像有限,arm架构的镜像有局限性,所以使用xinference-local 方式启动xinference来获取模型。Langchain-chatchat使用docker compose启动。(1)启动模型首先是使用 xinference-local --host 0.0.0.0 --port 9997启动xinference,成功启动后,使用ip+9997来打开页面。打开这个页面后,就可以拉取模型来使用了,xinference里面包含的模型可以直接点击下载使用,不包含的需要先使用modelscope下载,然后再注册到xinference以便后续使用。词嵌入模型和大模型都按照自己所需要的配置进行下载,然后下载方式选择modelscope即可。(2)修改模型文件修改/root/chatchat_data目录下model_settings.yaml,让拉取的模型添加到model的配置文件,可以把需要的模型都添加进行然后再到xinference拉取模型。需要修改的是两个地方,第一是支持的Agent模型把需要使用的添加进去,然后再到xinference部分添加上。(3)修改docker配置文件将修改好的model的路径挂载到docker内,最好是内外路径设定为一样的。因为docker启动后会自动生成/root/chatchat_data内容。 2.启动服务修改好配置后,需要初始化一下,以保证修改生效。export CHATCHAT_ROOT=/root/chatchat_datachatchat init之后就可以启动docker了docker-compose up -d启动成功后的输出为:需要注意的是每次使用都需要先本地启动xinference启动模型后再打开docker才能使用。、然后使用ip+8501打开网页部署成功后会有一些默认的模型可以使用,这个是在部署之前的一些配置文件中就设定好的,但是只能选择已经下载获取的模型进行使用。使用体验1.新建知识库自定义名称和选择合适的向量库和词嵌入模型来创建新的知识库。创建完成后就可以上传文档了2.知识库问答使用RAG对话进行问答,选择合适的知识库和模型。     
  • [分享交流] 兰州理工大学举办仓颉语言编程培训
    2025年5月10日在兰州理工大学彭家坪校区求是楼C205举办了一场仓颉语言编程培训,培训由布道师赵宏老师主持,学生布道师惠旭同,学生预备布道师陈康平、孙其翔协助。39名同学参加了培训,同学们在培训方搭建的Jupyter Lab平台上进行了仓颉编程实践,并完成培训测试。后续,培训方将继续组织同学们学习仓颉编程语言,并实践基于仓颉的鸿蒙应用开发。
  • [技术干货] 鲲鹏DevKit之多点并行调试
    本案例选择MPI应用来验证展示鲲鹏DevKit的多点并行调试能力以及鲲鹏平台远程编译调试能力。并借助开发者空间云主机提供的CodeArts IDE和鲲鹏服务器进行MPI应用的编译与并行调试,让开发者直观体验鲲鹏DevKit编译调试功能。1 概述1.1 背景介绍鲲鹏DevKit是覆盖软件迁移、应用开发和性能调优的全流程鲲鹏原生开发工具,可以帮助开发者加速应用迁移和算力升级,提供鲲鹏开发套件,包括应用迁移和性能分析等一些列软件工具。通过实际操作,让大家了解如何通过鲲鹏DevKit插件远程连接DevKit工具,并对应用进行远程编译调试,体验鲲鹏DevKit在鲲鹏原生开发过程中给开发者提供的便利。1.2 适用对象企业个人开发者高校学生1.3 案例时间本案例总时长预计120分钟。1.4 案例流程说明:① 自动部署鲲鹏服务器;② 安装鲲鹏DevKit插件;③ 下载MPI程序源文件;④ 环境安装;⑤ 编译应用;⑥ 并行调试。1.5 资源总览本案例预计花费总计0元。资源名称规格单价(元)时长(分钟)云主机2vCPUs4GBX86鲲鹏服务器2vCPUs8GBEulerOS 2.82 操作步骤2.1 自动部署鲲鹏服务器在云主机桌面右键选择“Open Terminal Here”,打开命令终端窗口。执行自动部署命令如下:hcd deploy --password abcd1234@ --time 7200 命令的参数说明:password:password关键字后设置的是鲲鹏服务器的root用户密码,命令中给出的默认为abcd1234@,开发者可以替换成自定义密码(至少8个字符)。time:time关键字后面设置的为鲲鹏服务器的可用时间,单位为秒,至少600秒。本案例建议申请的时间为120分钟,即7200秒。记录部署鲲鹏服务器公网IP,例如截图中对应的就是:1.94.112.100,实际操作时使用个人部署的鲲鹏服务器IP。2.2 安装鲲鹏DevKit插件由于CodeArts IDE在线安装的鲲鹏DevKit工具版本过低,所以需要前往鲲鹏社区官网下载最新鲲鹏DevKit插件到云主机,下载地址为:插件市场。如下图所示,进入到下载页面后选择最新版本进行下载。如果插件市场无法下载或下载失败可直接在浏览器下载。在云主机桌面,打开CodeArts IDE for Python/Java开发环境,单击右侧“扩展”按钮,点击“从本地安装”,选择下载好的插件安装。在弹窗中选择“继续安装”。2.3 下载MPI程序源文件在云主机桌面右键选择“Open Terminal Here”,打开命令终端窗口,输入以下命令下载并解压待使用的MPI程序源文件。wget https://codeload.github.com/kunpengcompute/devkitdemo/zip/refs/heads/devkitdemo-23.0.1 unzip devkitdemo-23.0.1 解压后“Compiler_and_Debugger/mpi_demo/”路径下的bcast_demo.c作为MPI程序源文件。2.4 环境安装以下工具或依赖库安装更新都是在2.1自动部署的鲲鹏服务器上进行的,不是云主机,确定好操作环境再进行安装。使用“ssh root@鲲鹏服务器公网IP”命令连接远程鲲鹏服务器,“鲲鹏服务器公网”就是自动部署鲲鹏服务器后记录的IP地址。2.4.1 安装mpicc由于在自动部署拉起的服务器上进行编译调试时,需要使用mpicc,mpicc是MPI实现的一部分,常见的MPI实现有OpenMPI和MPICH。这里安装OpenMPI。使用ssh命令(ssh root@鲲鹏服务器公网IP)连接远程鲲鹏服务器后,执行以下命令安装OpenMPI。sudo yum update -y sudo yum install -y openmpi openmpi-devel配置环境变量:1.编辑配置文件,进入Vim窗口后,按“i”编辑profile。sudo vim /etc/profile2.在文件末尾添加以下内容。export PATH=\$PATH:/usr/lib64/openmpi/bin3.按“ECS”退出编辑,再按“:wq”保存修改并退出,然后刷新配置文件。source /etc/profile安装 OpenMPI 后会提供 mpicc,查看 mpicc 的版本信息成功,表明 mpicc 已经成功安装在你的系统中。mpicc --version2.4.2 安装MPI由于目前环境中mpirun版本为2.1.1,不满足lldb-server服务要求,需要更新。这里我们安装MPI 4.1.4版本。同样在远程鲲鹏服务器中,下载安装包。mkdir -p /path/to/OpenMPI cd /path/to/OpenMPI wget https://dtse-mirrors.obs.cn-north-4.myhuaweicloud.com/case/0018/openmpi-4.1.4.tar.gz tar -zxvf openmpi-4.1.4.tar.gz安装依赖包。yum install -y numactl-devel-\* systemd-devel-\* 加载编译器。export PATH=/path/to/GUN/bin:\$PATH export LD_LIBRARY_PATH=/path/to/GUN/lib64:\$LD_LIBRARY_PATH 执行以下命令进行配置预编译。cd openmpi-4.1.4 ./configure --prefix=/path/to/OPENMPI --enable-pretty-print-stacktrace --enable-orterun-prefix-by-default --with-cma --enable-mpi1-compatibility CC=gcc CXX=g++ FC=gfortran安装编译。make -j 2 make install配置环境变量:1.编辑配置文件,进入Vim窗口后,按“i”编辑profilesudo vim /etc/profile2.在文件末尾添加export PATH=/path/to/GNU/bin:/path/to/OPENMPI/bin:\$PATH export LD_LIBRARY_PATH=/path/to/GNU/lib64:/path/to/OPENMPI/lib:\$LD_LIBRARY_PATH 3.按“ECS”退出编辑,再按“:wq”保存修改并退出,然后刷新配置文件。source /etc/profile/path/to/OPENMPI/:OpenMPI实际安装的路径,请根据实际情况进行替换。执行以下命令验证OpenMPI是否安装成功。mpirun --version2.4.3 创建libstdc++.so.6软链接由于/usr/lib64/libstdc++.so.6版本较旧,不包含GLIBCXX_3.4.26,不满足lldb-server需求。这里用软链接方式将/usr/lib64/libstdc++.so.6 的链接指向 /opt/Devkit/tools/libstdc++.so.6。建议备份/usr/lib64/libstdc++.so.6。sudo mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.bak建立软链接。sudo ln -s /opt/DevKit/tools/libstdc++.so.6 /usr/lib64/libstdc++.so.6 检查软链接。ls -l /usr/lib64/libstdc++.so.6 2.5 编译应用在云主机桌面双击打开CodeArts IDE,打开解压后的MPI程序,即解压后“Compiler_and_Debugger/mpi_demo/”路径。打开工程后,点击打开bcast_demo.c文件,修改85行为:“int color = rankNum / 1;”。即将调试时划分通信子组规则由2个rank为1个通信子组改为1个rank为1个通信子组。进入鲲鹏DevKit插件,选择使用鲲鹏DevKit窗口中的“开始使用”,配置IP和端口,IP是2.1自动部署鲲鹏服务器得到的弹性公网IP,端口是8086,服务证书选择“信任当前服务证书”。首次登录需要创建管理员密码,登录成功后,点击“编译”,添加目标服务器。添加远程鲲鹏服务器为目标服务器,服务器IP地址为鲲鹏服务器弹性公网IP地址。然后再次点击“编译”到编译配置窗口,服务器信息会自动带出,配置编译命令后再点击“编译”。编译命令如下:mpicc -g bcast_demo.c -o bcast_demo首次创建后再修改编译和调试配置可以通过点击CodeArts IDE底部“鲲鹏DevKit”,点击右上角“设置”按钮,再选择 “工程设置”即可对编译和调试配置进行二次修改。根据提示输入鲲鹏服务器密码,编译成功会在鲲鹏服务器/root/workspace/mpi_demo目录下生成带调试信息的可执行文件bcast_demo。2.6 并行调试在DevKit插件中点击“调试”,打开调试页面,选择“HPC并行应用”,配置MPI应用调试参数,点击“开始调试”。应用程序:/root/workspace/mpi_demo/bcast_demo应用程序源码路径:/root/workspace/mpi_demoMPI运行命令行:mpirun --allow-run-as-root -np 2参数说明如下:参数说明远程服务器配置进行HPC并行应用调试的目标服务器Linux用户名输入启动MPI应用的Linux用户名称Linux用户密码使用的Linux用户密码SSH端口驶入启动MPI应用的服务器SSH端口号应用程序输入的MPI应用,支持动态检索并显示应用程序路径应用程序参数(可选)传递给应用程序运行的参数应用程序源码路径源码和MPI应用存放的共享路径,支持动态检索并显示应用程序源码路径。环境变量设置(可选)输入运行HPC并行应用所需要的环境变量调试启动方式调试启动方式可选: mpirun命令运行方式 多瑙调度器运行方式 Slurm调度器运行方式MPI运行命令行输入的mpirun命令以及对应的命令参数,rank数目为1~2048OpenMP应用(可选)勾选后,需要输入OpenMP线程数。死锁检测(可选)勾选后,需要输入死锁超时时间。​rank​:rank 用于标识 MPI 并行程序中各个进程的唯一编号,在特定通信组内具有唯一性,且决定进程间通信和数据交互的顺序与方式。在 MPI 并行程序执行时,会启动多个进程协同工作,rank 就像是每个进程的 “身份证号”。开始调试后会读取rank状态:在rank状态读取过程中,若rank状态读取全部成功,会自动跳转到MPI应用调试页面。页面上获取到运行和调试区、源码区和调试功能区,运行和调试区域包括调试信息区和rank信息区。HPC并行应用调试支持三种调试粒度,分别为“全部”调试、“rank”调试或“通信组”调试。调用方式效果全部在RANK信息区域选择“全部”方式进行调试,选择某一个rank,对其进行调试会应用到全部rank。rank在RANK信息区域选择“rank”方式进行调试,对单一rank进行调试。通信组在RANK信息区域选择“通信组”方式进行调试,选择通信组中的某一个rank,对其进行调试会应用到整个通信组。调试按钮操作描述:操作操作描述继续点击执行到下一个断点单步跳过点击执行到下一行单步调试点击步入函数单步跳出点击步出函数停止点击后停止调试RANK信息区域选择“全部”调试方式,在89行代码处、47行代码处和93行代码处打上断点,再继续执行后续操作。选择“全部”调试方式,单击“继续”按钮,代码执行到89行,再单击“下一步”执行MPI_Comm_split(MPI_COMM_WORLD, color, rankNum, &row_comm)函数,该函数可将所有的rank进行通信分组。这里将2个rank生成2个通信子组,rank1在通信子组1,rank0在通信子组2。生成2个通信子组后,所有rank的源码执行到90行代码处,选择“通信组”调试方式,选择通信子组1中的rank1,单击“下一步”按钮,通信子组1中的rank代码执行到92行,通信子组2中的rank0代码无变化,停留在90行。调试通信子组1:未调试通信子组2:选择“通信组”调试方式,在左侧通信子组1中选择rank1,单击“继续”按钮,代码执行到47行,单击“下一步”按钮,执行MPI_Barrier(MPI_COMM_WORLD)函数,函数执行完成后,通信子组1会一直处于等待状态,此时,在左侧通信子组2中选择rank0,单击“继续”按钮,代码执行到47行,单击“下一步”按钮,执行MPI_Barrier(MPI_COMM_WORLD)函数,函数执行完成后,通信子组1不再等待,同步执行到49行代码处。rank1处于等待状态:rank0执行后,rank1、rank同步执行到49行:单击“点击放大”按钮,在CodeArts IDE面板中能看到通信子组的变化概览,每100ms显示通信子组的变化。通信子组的变化用不同颜色的菱形来区分,蓝色表示通信子组创建,紫色表示通信子组清除,黄色表示100ms内存在通信子组创建和通信子组清除。释放掉47行断点,RANK信息区域选择“全部”调试方式,循环点击“继续”按钮,代码执行到93行,在单击“下一步”按钮,执行MPI_Comm_free(&row_comm)函数,当不再调试某一通信子组时,可以释放创建的通信子组,该函数能实现释放创建的通信子组。点击侧边或下方工具栏中“运行和调试”查看调试信息。至此,使用鲲鹏DevKit工具进行MPI应用并行调试完成。3 问题记录3.1 编译调试问题1、重复操作案例或更换鲲鹏服务器重新编译失败​报错​:cd: /root/workspace/mpi_demo: No such file or directory​原因​​:mpi_demo在第一次编译时同步项目到鲲鹏服务器中,并在项目下缓存了记录,想要再次编译时触发同步项目需要删除mpi_demo下的缓存文件。​解决​:删除云主机中mpi_demo项目下的缓存文件./devkit,删除后重新点击编译,参考2.5编译应用配置编译命令(mpicc -g bcast_demo.c -o bcast_demo)即可。cd /home/developer/Desktop/devkitdemo-devkitdemo-23.0.1/Compiler_and_Debugger/mpi_demo rm -rf .devkit/ “/home/developer/Desktop/devkitdemo-devkitdemo-23.0.1/Compiler_and_Debugger/mpi_demo”是云主机本地mpi_demo路径,以个人操作时实际路径为准。
  • [技术干货] 在华为开发者空间,基于鲲鹏使用毕昇编译器Autotuner自动调优实践
    案例介绍毕昇编译器基于开源LLVM开发,并进行了优化和改进,同时支持Fortran语言前端,是针对鲲鹏平台的高性能编译器。案例内容1 概述1.1 背景介绍鲲鹏服务器是基于鲲鹏处理器的新一代数据中心服务器,适用于大数据、分布式存储、高性能计算和数据库等应用。鲲鹏服务器具有高性能、低功耗、灵活的扩展能力,适合大数据分析、软件定义存储、Web等应用场景。毕昇编译器基于开源LLVM开发,并进行了优化和改进,同时支持Fortran语言前端,是针对鲲鹏平台的高性能编译器。除LLVM通用功能和优化外,对中端及后端的关键技术点进行了深度优化,并集成Auto-tuner特性支持编译器自动调优。1.2 适用对象企业个人开发者高校学生1.3 案例时间本案例总时长预计60分钟。1.4 案例流程说明:① 自动部署鲲鹏服务器;② 安装Python软件包;③ 安装毕昇编译器AutoTuner;④ AutoTuner自动调优。1.5资源总览本案例预计花费总计0元。资源名称规格单价(元)时长(分钟)云主机2vCPUs 4GB免费602 操作步骤2.1 自动部署鲲鹏服务器在云主机桌面右键选择“Open Terminal Here”,打开命令终端窗口。执行自动部署命令如下:hcd deploy --password abcd1234@ --time 3600命令的参数说明:password:password关键字后设置的是鲲鹏服务器的root用户密码,命令中给出的默认为abcd1234@,开发者可以替换成自定义密码(至少8个字符)。time:time关键字后面设置的为鲲鹏服务器的可用时间,单位为秒,至少600秒。在命令中申请的时间为60分钟,即3600秒。该命令会自动部署鲲鹏服务器。首次部署会直接执行,旧资源未到期时重复部署,会提示是否删除前面创建的资源,可以删除旧资源再次部署。记录部署鲲鹏服务器公网IP,如截图中对应的就是:115.120.242.46。2.2 安装Python软件包新打开一个终端窗口,使用上一步中记录的公网IP登录鲲鹏服务器,命令如下:ssh root@鲲鹏服务器公网IP输入密码,密码为步骤2.1中自动部署命令行中“–password”后面的参数,命令中给出的默认为abcd1234@,如果没有修改,就使用abcd1234@进行登录,如果设置了自定义密码,直接输入自定义的密码(注意:输入过程中密码不会显示,密码输入完成按回车键结束)。登录成功后,输入命令安装Python依赖包,命令如下:yum -y groupinstall "Development Tools" --nogpgcheckyum -y install gcc openssl-devel bzip2-devel libffi-devel python3-devel sqlite-devel --nogpgcheckPython-3.11.4不支持OpenSSL-1.1.1以下的版本,所以需要下载编译OpenSSL-1.1.1版本,下载并解压源码命令如下:(*openssl下载备用链接:https://dtse-mirrors.obs.cn-north-4.myhuaweicloud.com/case/0014/openssl-1.1.1t.tar.gz)wget https://dtse-mirrors.obs.cn-north-4.myhuaweicloud.com/case/0014/openssl-1.1.1t.tar.gztar -xzf openssl-1.1.1t.tar.gzcd openssl-1.1.1t编译并安装 OpenSSL 到自定义目录以避免覆盖系统版本。./config --prefix=/usr/local/openssl-1.1.1 --openssldir=/usr/local/openssl-1.1.1 shared zlibmakemake install更新动态链接库缓存。echo "/usr/local/openssl-1.1.1/lib" > /etc/ld.so.conf.d/openssl-1.1.1.confldconfig毕昇编译器AutoTuner环境要求Python版本为Python-3.11.4,进入到/opt目录下载并解压Python3.11.4源码。cd /optwget https://mirrors.huaweicloud.com/python/3.11.4/Python-3.11.4.tar.xztar -xvJf Python-3.11.4.tar.xzcd Python-3.11.4编译和安装,配置编译选项并开始编译。./configure --prefix=/usr/local/ --with-openssl=/usr/local/openssl-1.1.1makemake installpython3 -m pip install --upgrade pip2.3 安装毕昇编译器AutoTuner下载并解压毕昇编译器。mkdir -p /opt/compilercd /opt/compilerwget https://kunpeng-repo.obs.cn-north-4.myhuaweicloud.com/BiSheng%20Enterprise/BiSheng%20Enterprise%20203.0.0/BiShengCompiler-4.1.0-aarch64-linux.tar.gztar -zxvf BiShengCompiler-4.1.0-aarch64-linux.tar.gz配置毕昇编译器环境变量。export PATH=/opt/compiler/BiShengCompiler-4.1.0-aarch64-linux/bin:$PATH export LD_LIBRARY_PATH=/opt/compiler/BiShengCompiler-4.1.0-aarch64-linux/lib:/opt/compiler/BiShengCompiler-4.1.0-aarch64-linux/lib/aarch64-unknown-linux-gnu:$LD_LIBRARY_PATH安装完毕后执行命令验证毕昇编译器版本。clang -v安装Autotuner。install-autotuner.shllvm-autotune -hauto-tuner -h2.4 AutoTuner自动调优实践CoreMark是衡量中央处理器(CPU)和嵌入式微控制器(MCU)性能的行业标准基准。我们这里以CoreMark为例展示如何运行自动调优。下载CoreMark代码。mkdir bisheng_compiler_democd bisheng_compiler_demogit clone https://github.com/eembc/coremark.git如果克隆失败,可以通过以下链接下载并解压:wget https://dtse-mirrors.obs.cn-north-4.myhuaweicloud.com/case/0014/coremark.zipunzip coremark.zip创建执行脚本,将进行20次迭代调优coremark代码并对比调优效果。cd coremark/vi run_autotuner.sh进入到vim编辑器界面内,按下“i”键将下段代码复制到编辑器内。#!/bin/bashexport AUTOTUNE_DATADIR=/tmp/autotuner_datarm -rf $AUTOTUNE_DATADIRmkdir -p $AUTOTUNE_DATADIRCompileCommand="clang -Iposix -I. -g -DFLAGS_STR=\"\" -DITERATIONS=300000 core_list_join.c core_main.c core_matrix.c core_state.c core_util.c posix/core_portme.c -O2 -o coremark"$CompileCommand -fautotune-generate;llvm-autotune minimize;for i in $(seq 20)do $CompileCommand -fautotune; ( time -p ./coremark 0x0 0x0 0x66 300000 ) 2>time.log time=$( grep real time.log | sed 's/real\s*//' ) echo "iteration: " $i "cost time:" $time; llvm-autotune feedback $time;donellvm-autotune finalize;复制完成后,按下“ESC”键->输入“:wq”保存并退出编辑器界面。添加该文档执行权限。chmod u+x run_autotuner.sh在终端中输入命令执行脚本,开始进行Autotuner迭代调优,进行20次循环迭代,并获取每次的性能数据作为反馈,执行过程约5~10分钟。./run_autotuner.sh打印内容如下所示,完成20次迭代后,将迭代获取的最优编译配置文件到脚本设置的AUTOTUNE_DATADIR目录:/tmp/autotuner_data/config.yaml调用最优配置文件,为了进行后续的优化编译,首先配置AUTOTUNE_DATADIR环境变量。export AUTOTUNE_DATADIR=/tmp/autotuner_data/直接使用-fautotune选项调用最优配置文件config.yaml进行优化编译,执行如下命令,编译生成优化后的coremark可执行文件coremark_autotuner:clang -Iposix -I. -g -DFLAGS_STR=\"\" -DITERATIONS=300000 core_list_join.c core_main.c core_matrix.c core_state.c core_util.c posix/core_portme.c -O2 -g -o coremark_autotuner -fautotune执行如下命令,获取优化后coremark可执行文件的运行时间(单位为秒):( time -p ./coremark_autotuner 0x0 0x0 0x66 300000 ) 2> time.log从图中可以看出,经过Autotuner优化后的coremark300000次迭代的执行时间为18.40s。使用毕昇编译器编译coremark用户代码,执行如下命令,生成未调优的coremark可执行文件进行对比,通过运行coremark可执行文件的时间差异来测试调优性能是否有提升,软件运行时间越短表示性能越好:clang -Iposix -I. -g -DFLAGS_STR=\"\" -DITERATIONS=300000 core_list_join.c core_main.c core_matrix.c core_state.c core_util.c posix/core_portme.c -O2 -g -o coremark之后执行如下命令,获取优化前coremark可执行文件的运行时间(单位为秒):( time -p ./coremark 0x0 0x0 0x66 300000 ) 2> time.log从图中可以看出,未经过Autotuner优化后的coremark300000次迭代的执行时间为19.56s。经比较可以发现,调优后的性能可以提升6%~7%(优化前时间/优化后时间-100%)左右,说明使用Autotuner编译调优对性能有较大改善。至此,基于鲲鹏使用毕昇编译器Autotuner自动调优实践全部完成。
  • [技术干货] 鲲鹏架构的Python高性能计算实践与DevLit优化框架应用
    “随着异构计算需求的增长,ARM架构服务器在数据中心领域的应用日益广泛。本文深入探讨了华为鲲鹏处理器在Python科学计算生态中的应用实践,分析了DevLit优化框架在鲲鹏平台上的部署与性能优化方法,并通过实验数据验证了该方案在大规模数据处理场景下的效能提升。研究表明,通过针对性优化,鲲鹏架构能够为Python科学计算工作负载提供显著的性能与能效优势。”1. 背景计算架构多样化已成为当今高性能计算领域的重要趋势。华为鲲鹏处理器作为基于ARM架构的高性能计算平台,以其卓越的能效比和可扩展性,正在数据中心和科学计算领域获得广泛应用。Python作为科学计算和人工智能领域最流行的编程语言之一,其在新兴计算架构上的性能优化成为研究热点。本文旨在探讨基于华为鲲鹏架构的Python科学计算生态系统构建,以及DevLit优化框架在此平台上的应用实践。通过分析鲲鹏架构的技术特性,结合Python计算框架的优化方法,为高性能计算应用提供参考方案。2. 鲲鹏架构技术特性分析2.1 鲲鹏处理器架构概述华为鲲鹏处理器基于ARM v8架构设计,采用多核心设计理念,具有以下关键特性:高核心密度:单芯片最高支持64核心,提供强大的并行计算能力大缓存架构:三级缓存结构,L3缓存容量达128MB,有效减少内存访问延迟优化的向量计算单元:支持SVE(Scalable Vector Extension)指令集,适合科学计算工作负载创新的内存子系统:支持DDR4-3200内存,带宽可达192GB/s华为鲲鹏920处理器采用7nm工艺制程,在保持高性能的同时,能效比相比同类x86处理器提升30%以上,这一特性使其在数据中心应用中具有明显优势。2.2 与传统x86架构的差异分析鲲鹏架构与x86架构在指令集、内存访问模式和缓存策略等方面存在显著差异:指令集特性:ARM指令集相比x86更为精简,指令译码效率更高内存访问模式:ARM架构采用不同的内存一致性模型,影响并行程序性能向量计算能力:SVE指令集提供可扩展的向量长度,相比x86的AVX-512具有更好的灵活性这些差异对Python科学计算库的性能有直接影响,需要针对性优化才能发挥鲲鹏架构的最大潜力。3. Python在鲲鹏平台的适配与优化3.1 Python核心解释器优化针对鲲鹏架构特性,Python解释器的优化包括:字节码执行引擎优化:利用ARM架构的寄存器优势,减少内存访问内存管理优化:根据鲲鹏内存子系统特性,调整垃圾回收策略JIT编译优化:针对热点代码路径,生成ARM原生指令优化后的Python解释器在鲲鹏平台上基准测试性能提升20%-35%,显著改善了CPU密集型任务的执行效率。3.2 科学计算库适配主流Python科学计算库在鲲鹏平台的适配情况:表1: 科学计算库在鲲鹏平台的适配状态+------------+---------------+---------------------+| 库名称 | 版本号 | 性能状态 |+------------+---------------+---------------------+| NumPy | 1.21.0+ | 完全优化,性能+40% || SciPy | 1.7.0+ | 基本优化,性能+25% || Pandas | 1.3.0+ | 部分优化,性能+15% || scikit-learn| 1.0.0+ | 基本优化,性能+20% |+------------+---------------+---------------------+核心优化策略包括:利用BLAS/LAPACK优化实现(OpenBLAS-ARM)向量化计算利用SVE指令集内存访问模式优化,减少缓存失效多线程并行计算框架调整4. DevLit优化框架概述与应用4.1 DevLit框架介绍DevLit是一个专为异构计算环境设计的高性能计算优化框架,具有以下特点:抽象计算图表示:将计算任务抽象为计算图,便于分析和优化自动调度策略:根据硬件特性自动选择最优执行策略算子融合技术:减少内存访问,提高计算密度硬件感知优化:针对不同硬件平台生成优化代码在鲲鹏平台上,DevLit通过深度整合ARM计算库和编译技术,为Python应用提供了强大的性能提升能力。4.2 DevLit在鲲鹏平台的部署方案DevLit在鲲鹏平台的部署架构如图1所示: +------------------+ | Python应用层 | +------------------+ | +------------------+ | DevLit优化层 | +------------------+ / \ +--------------+ +--------------+ | 计算图优化器 | | 代码生成引擎 | +--------------+ +--------------+ \ / +------------------+ | 鲲鹏硬件抽象层 | +------------------+ | +------------------+ | 鲲鹏处理器 | +------------------+部署流程包括:安装鲲鹏优化版Python开发环境部署DevLit优化框架核心组件配置硬件特性感知模块安装优化后的科学计算库应用程序适配与调优本文分享自华为云社区博客《鲲鹏架构的Python高性能计算实践与DevLit优化框架应用【华为根技术】》,作者: i-WIFI。
  • [技术干货] 鲲鹏DevKit代码迁移工具快速完成C&C++源码迁移
    一、 案例介绍鲲鹏和传统X86两者的指令集不同(X86是复杂指令集、鲲鹏使用精简指令集),一样的代码经过编译后,在不同的芯片架构下转换成的不同的机器码,从而不能交叉运行。为了帮助开发者解决将软件从X86平台迁移到鲲鹏平台过程中遇到的疑难问题,鲲鹏提供了DevKit迁移工具,帮助开发者更快更方便的实现跨平台软件的迁移。本次实验将完成鲲鹏DevKit代码迁移工具的使用,了解其基本功能和使用方法。本案例将指导开发者如何使用鲲鹏DevKit代码迁移工具,以smartdenovo软件包为待迁移案例展示C/C++软件的快速迁移过程,达到快速完成C&C++源码迁移的实验目的。如果希望更进一步了解DevKit代码迁移工具Porting Advisor,欢迎大家前往鲲鹏社区了解代码迁移工具的详细使用方法:https://www.hikunpeng.com/document/detail/zh/kunpengdevps/porting/qs/qs-pa-kunpengdevps.html二、 免费领取云主机如您还没有云主机,可点击链接,根据领取指南进行操作。如您已领取云主机,可直接开始实验。三、 实验流程说明:① 下载迁移源码;② 自动部署装有DevKit的鲲鹏服务器;③ 安装鲲鹏代码迁移插件;④ 登录DevKit工具;⑤ 执行源码扫描任务;⑥ 根据扫描报告修改源码。四、下载迁移源码smartdenovo是一款在github上开源的一款基于C语言开发的开源软件,基于X86平台进行开发,源码地址如下:cid:link_6。在实验的过程中,还需要avxToNeon的源代码,当应用程序从x86架构移植到鲲鹏架构时,由于Arm64指令名称和功能与x86不同,需要进一步开发指令。为了减少用户的移植工作量,在avxToNeon项目中,常用的AVX指令被封装为独立的模块, AVX指令被相关的NEON SIMD指令取代,而指令名称和功能保持不变。用户可以通过将相关头文件导入应用软件来调用相应的指令。avxToNeon的源码存放地址如下:cid:link_5。在云主机桌面创建smart-denovo文件夹,在该文件夹下打开终端命令窗口,克隆两个开源项目代码:将AvxToNeon复制到smartdenovo项目目录下,然后将smartdenovo打成zip压缩包,留作后面创建源码迁移任务。五、自动部署装有DevKit的鲲鹏服务器在云主机打开终端窗口,执行自动部署命令:hcd deploy --password 远端服务器密码 --time 3600# --password 待部署项目所在ECS的root用户密码(至少8个字符)# --time value 待部署资源的保留期(单位为秒,至少600秒,默认600秒)。当前实验预估需要1小时,可以配置time为1-2小时保留期。该命令会自动部署鲲鹏服务器并安装DevKit。首次部署会直接执行,旧资源未到期时重复部署,会提示是否删除前面创建的资源,可以删除旧资源再次部署。记录部署远端服务器公网IP、Devkit平台访问地址,如截图中对应的就是:124.71.195.85、https://124.71.195.85:8084。这里自动部署安装有DevKit工具的ECS服务器使用到的Terraform可以在部署后,到华为开发者空间,鲲鹏沙箱资源中进行下载,下载后您可以在华为云资源编排服务RFS通过该模板进行部署安装有DevKit工具的ECS服务器。六、安装鲲鹏代码迁移插件方式一:在线安装进入云主机,打开CodeArts IDE,点击左侧“扩展”搜索“Kunpeng Porting Advisor Plugin”点击安装该插件。​方式二:本地安装前往鲲鹏社区官网下载插件Kunpeng Porting Advisor Plugin到云主机,下载地址为:CodeArts IDE插件市场。​在云主机桌面,打开CodeArts IDE开发环境,单击右侧“扩展”按钮,点击从本地安装,选择下载好的插件安装。​使用任一方式安装好插件后,在CodeArts IDE点击左上角“文件”,选择“设置”,在设置界面选择“应用程序”-“代理服务器”,将“Proxy Support”设置为“off”。​七、登录DevKit工具在云主机进入CodeArts IDE,打开安装好的鲲鹏代码迁移插件,点击点击“…”中的“配置远端服务器”。填配置远端服务器成功后,点击“登录”,首次登录需要创建管理员密码。安装完成后选择“采用SSH连接时输入的IP地址xxx.xxx.xx.xx”然后点击立即登录。首次登录需要设置密码,设置密码后进行登录。八、执行源码扫描任务登录代码迁移工具成功后,在插件窗口新建源码迁移任务。在新建源码迁移任务界面,上传步骤五打好的smartdenovo.zip压缩包,目标操作系统切换成EulerOS 2.8,其他保持默认,点击“开始分析”。扫描完成完成后,点击CodeArts IDE下面“终端”登录到远端弹性云服务器(命令:ssh root@远端服务器公网IP),在远端服务器中执行以下命令,编译迁移前的代码,对比迁移效果。尝试编译未进行迁移修改的代码,查看是否可以编译成功。编译运行命令如下:cd /opt/portadv/portadmin/sourcecode/smartdenovo/make从执行结果中可以看到,编译过程报错,无法成功编译smartdenovo软件包。接下来根据扫描报告修改源码后再编译。九、根据扫描报告修改源码在扫描报告界面,可以在“需要迁移的源文件”下查看需要修改文件,点击“查看建议代码”后可跳转到源码页面,根据修改建议直接修改源码。从迁移报告中可以得知,有Makefile和ksw.c两个文件需要修改。首先点击ksw.c对应的“查看建议代码”按钮,修改ksw.c的源代码。1、修改源码文件ksw.c根据源码页面中的红色波浪线发现一共有两处修改点修改点一:点击“快速修复…”按钮后,在右下角的弹框中点击确认按钮,自动完成此处的代码适配。修改后,效果如下:修改点二:使用快速自动修改,修改效果如下图所示,增加了ARM的NEON指令库头文件。增加的头文件需要引入到工程中,点击CodeArts IDE下面菜单栏中“终端”,登录远端弹性云服务器(命令:ssh root@远端服务器公网IP),在远端服务器中执行以下命令将头文件目录复制一份到/opt/portadv/portadmin/sourcecode/smartdenovo的include目录里。cd /opt/portadv/portadmin/sourcecode/smartdenovomkdir includecp -r /opt/portadv/portadmin/sourcecode/smartdenovo/AvxToNeon /opt/portadv/portadmin/sourcecode/smartdenovo/include/AvxToNeon​2、修改构建文件Makefile在“源码迁移建议”页面,查看Makefile文件的修改建议,悬浮在黄色波浪线的语句上,可以看到详细的迁移建议。根据建议,Makefile文件中需要给CFLAGS变量增加选项内容-march=armv8-a -fsigned-char,同时,还需要删除CFLAGS变量中的选项“-mpopcnt”和“-msse3”。 同时,由于增加了额外的Neon库头文件,Makefile文件中还需要给CFLAGS变量增加选项内容-I./include/AvxToNeon。修改效果如下:图片中5-7行代码修改为如下:CFLAGS=-I./include/AvxToNeon -g3 -W -Wall -O0 -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -march=armv8-a -fsigned-charelseCFLAGS=-I./include/AvxToNeon -W -Wall -O4 -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -march=armv8-a -fsigned-char此外,因smartdenovo的系统兼容性问题,在CodeArts IDE的系统中无法直接编译,还需要修改 smartdenovo/wtlay.h 文件。点击CodeArts IDE下面菜单栏中“终端”,登录远端弹性云服务器(命令:ssh root@远端服务器公网IP),在远端服务器中执行以下命令进行修改:cd /opt/portadv/portadmin/sourcecode/smartdenovo/vi wtlay.h回车后进入编辑界面,点击ESC按键后,输入:516,按回车后跳转到516行,按下键盘上的A按键,进入编辑模式,如下图所示。在该行前面添加“static”,修改完成后点击ESC按键,输入:wq!,点击回车。至此,所有源码迁移修改都已经完毕。点击CodeArts IDE下面菜单栏中“终端”,登录远端弹性云服务器(命令:ssh root@远端服务器公网IP),在远端服务器中执行以下命令进行编译,从输出中可以看到,编译成功完成,无报错信息展示:cd /opt/portadv/portadmin/sourcecode/smartdenovo/make迁移后可以在远端鲲鹏服务器上编译成功。点击CodeArts IDE下面菜单栏中“终端”,登录远端弹性云服务器(命令:ssh root@远端服务器公网IP),在远端服务器中编译生成的二进制文件有 wtmsa,wtcns,wtlay等。可以执行这些文件看看。./wtmsa到这里整个实验流程就已经结束了,通过上面的源码迁移动作我们拿到了可以在鲲鹏平台上运行的smartdenovo软件包。各位鲲鹏开发者也可以参考上面的软件迁移过程迁移一些其他的跨平台软件,同时探索迁移工具提供的软件包扫描、亲和分析等功能,更深入的掌握迁移工具的使用方法。
  • [技术干货] 在华为开发者空间,基于鲲鹏搭建Termgraph绘图工具
    “【摘要】 本实验将指导开发者如何在鲲鹏服务器搭建一个Termgraph工具,并根据源码提供的测试文件绘制统计图形。”一、案例介绍鲲鹏服务器是基于鲲鹏处理器的新一代数据中心服务器,适用于大数据、分布式存储、高性能计算和数据库等应用。鲲鹏服务器具有高性能、低功耗、灵活的扩展能力,适合大数据分析、软件定义存储、Web等应用场景。Termgraph是一个Python的命令行工具,用于在终端中绘制基本图形。通过灵活地运用Termgraph工具,能够在无需复杂图形界面的情况下,高效地将数据转化为可视化的终端图形,为数据处理与分析工作带来极大的便利与趣味。本实验将指导开发者如何在鲲鹏服务器搭建一个Termgraph工具,并根据源码提供的测试文件绘制统计图形。二、免费领取云主机如您还没有云主机,可点击链接 ,根据领取指南进行操作。如您已领取云主机,可直接开始实验。三、实验流程说明:下载工具;自动部署并连接鲲鹏服务器;安装python3.7;安装绘图工具;使用工具绘图。四、实验资源本次实验预计花费总计0元。资源名称规格单价(元)时长云主机2vCPUs | 4GB RAM免费30分钟五、实验步骤5.1 准备鲲鹏服务器本实验中,使用云主机提供的鲲鹏沙箱资源,只需要执行简单的自动部署命令即可拉起一台免费的鲲鹏服务器。1. 在云主机桌面右键选择“Open Terminal Here”,打开终端命令窗口。2. 输入自动部署命令,命令如下:hcd deploy --password abcd1234! --time 1800命令的参数说明:• password:password关键字后设置的是鲲鹏服务器的root用户密码,命令中给出的默认为abcd1234!,开发者可以替换成自定义密码(至少8个字符)。• time:time关键字后面设置的为鲲鹏服务器的可用时间,单位为秒,至少600秒。当前实验预估需要20分钟,为了保证时间充足,在命令中申请的时间为30分钟,即1800秒。3. 记录下自动部署后生成的弹性公网IP地址。5.2 下载源码1. 使用命令登录到鲲鹏服务器,命令如下:ssh root@鲲鹏服务器公网IP输入密码,密码为步骤5.1中自动部署命令行中“--password”后面的参数,命令中给出的默认为abcd1234!,如果没有修改,就使用abcd1234!进行登录,如果设置了自定义密码,直接输入自定义的密码(注意:输入过程中密码不会显示,密码输入完成按回车键结束)。2. 从GitHub上拉取工具源码,命令如下:git clone https://github.com/mkaz/termgraph5.3 安装Python软件包因为兼容性问题,所以需要下载Python3.7以上版本,本次实验选择使用Python3.7.17版本。1. 下载并解压Python3.7.17源代码,命令如下:wget https://mirrors.huaweicloud.com/python/3.7.17/Python-3.7.17.tgztar xzf Python-3.7.17.tgzcd Python-3.7.172. 编译和安装,配置编译选项并开始编译,命令如下:./configure --prefix=/usr/local/makesudo make altinstall3. 验证python3.7.17和pip安装是否成功,命令如下:python3.7 --versionpip3.7 --version4. 安装termgraph工具pip3.7 install termgraph5.4 绘制图形根据项目中提供的测试数据文件生成统计图形,命令如下:cd /root/termgraphtermgraph data/ex1.dat该工具还提供了其他的命令参数适应的文件,如果感兴趣可以尝试一下。termgraph data/ex4.dat --color {blue,red}termgraph data/ex7.dat --color {yellow,magenta} --stacked --title "Stacked Data"termgraph --calendar --start-dt 2017-07-01 data/cal.dat至此,本次实验全部完成。
  • [技术干货] 使用鲲鹏BoostKit数学库优化程序性能
    1 概述1.1 背景介绍鲲鹏数学库(KML, Kunpeng Math Library)是基于鲲鹏平台优化的高性能数学函数库,由多个子库组成,广泛应用于科学计算、HPC等领域。 通过本案例,用户可以快速掌握鲲鹏数学库的安装与使用,并对所涉及的数学库性能表现有清晰认识。适用对象1.2 适用对象企业个人开发者高校学生1.3 案例时间本案例总时长预计30分钟。1.4 案例流程说明:① 自动部署并连接鲲鹏服务器;② 安装数学库;③ 修改环境变量;④ 数学库性能测试。1.5 资源总览本次实验预计花费总计0元。资源名称规格单价(元)时长(h)云主机2vCPUs4GB RAM免费0.52 操作步骤2.1 自动部署鲲鹏服务器本实验中,使用云主机提供的鲲鹏沙箱资源,只需要执行简单的自动部署命令即可拉起一台免费的鲲鹏服务器。在云主机桌面右键选择“Open Terminal Here”,打开终端命令窗口。输入自动部署命令,命令如下:hcd deploy --password abcd1234@ --time 1800命令的参数说明:password:password关键字后设置的是鲲鹏服务器的root用户密码,命令中给出的默认为abcd1234@,开发者可以替换成自定义密码(至少8个字符)。time:time关键字后面设置的为鲲鹏服务器的可用时间,单位为秒,至少600秒。当前实验在命令中申请的时间为30分钟,即1800秒。记录下自动部署后生成的鲲鹏服务器公网IP地址。2.2 安装数学库使用命令登录到鲲鹏服务器,命令如下:ssh root@鲲鹏服务器公网IP输入密码,密码为步骤2.1中自动部署命令行中“–password”后面的参数,命令中给出的默认为abcd1234@,如果没有修改,就使用abcd1234@进行登录,如果设置了自定义密码,直接输入自定义的密码(注意:输入过程中密码不会显示,密码输入完成按回车键结束)。使用命令下载数学库软件包,本次案例使用的是1.7.0版本。wget https://repo.oepkgs.net/openeuler/rpm/openEuler-20.03-LTS-SP3/extras/aarch64/Packages/b/boostkit-kml-1.7.0-1.aarch64.rpm解压软件包。rpm2cpio boostkit-kml-1.7.0-1.aarch64.rpm | cpio -div添加软链接,使用ln -s命令创建软链接,类似于Windows中的快捷方式,它是一个特殊的文件,其内容是指向另一个文件或者目录的路径,当访问软链接时,系统会根据软链接中的路径找到实际指向的目标文件或目录来进行操作。下面三组命令分别创建了libkspblas.so、libkvml.so和libkm.so三个软链接,分别指向根据find命令找到对应实际的kspblas.so、kvml.so和km.so文件cp -R /root/usr/local/kml/ /usr/local/cd /usr/local/kmlln -s 'find ./ -name \*kspblas.so\* -type f' ./libkspblas.soln -s 'find ./ -name \*kvml.so\* -type f' ./libkvml.soln -s 'find ./ -name \*km.so\* -type f' ./libkm.so2.3 修改环境变量在 Linux 系统中,LD_LIBRARY_PATH是一个重要的环境变量,它用于指定动态链接库(.so文件)的搜索路径。当程序在运行时需要加载动态链接库,系统会首先在默认的系统库路径中查找,然后会按照LD_LIBRARY_PATH环境变量所指定的路径顺序进行查找。将多个与/usr/local/kml相关的库目录添加到LD_LIBRARY_PATH环境变量中,是因为程序依赖于这些目录下的动态链接库来正确运行。通过将这些目录添加到LD_LIBRARY_PATH,可以确保程序在运行时能够找到所需的库文件。echo 'export LD\_LIBRARY\_PATH=/usr/local/kml/lib/kblas/locking:$LD\_LIBRARY\_PATH' >> /etc/profileecho 'export LD\_LIBRARY\_PATH=/usr/local/kml/lib:$LD\_LIBRARY\_PATH' >> /etc/profileecho 'export LD\_LIBRARY\_PATH=/usr/local/kml/lib/kblas/nolocking:$LD\_LIBRARY\_PATH' >> /etc/profileecho 'export LD\_LIBRARY\_PATH=/usr/local/kml/lib/kblas/omp:$LD\_LIBRARY\_PATH' >> /etc/profileecho 'export LD\_LIBRARY\_PATH=/usr/local/kml/lib/kblas/pthread:$LD\_LIBRARY\_PATH' >> /etc/profileecho 'export LD\_LIBRARY\_PATH=/usr/local/kml/lib/kvml/multi:$LD\_LIBRARY\_PATH' >> /etc/profileecho 'export LD\_LIBRARY\_PATH=/usr/local/kml/lib/kvml/single:$LD\_LIBRARY\_PATH' >> /etc/profileecho 'export LD\_LIBRARY\_PATH=/usr/local/kml/lib/kspblas/multi:$LD\_LIBRARY\_PATH' >> /etc/profileecho 'export LD\_LIBRARY\_PATH=/usr/local/kml/lib/kspblas/single:$LD\_LIBRARY\_PATH' >> /etc/profile执行命令使环境生效。source /etc/profile检查环境变量。env | grep LD\_LIBRARY\_PATH2.4 数学库性能测试1. KML_VML测试矢量数学库(Vector Math Library)借助计算密集型核心数学函数(幂函数、三角函数、指数函数、双曲函数、对数函数等)的矢量实施显著提升应用速度。使用命令创建测试文件test_sin.c文件。cdvi test\_sin.c进入到vim编辑器界面后,按下“i”键后,复制以下代码粘贴到编辑器中,复制完成后按下“ESC”键输入“:wq”,退出编辑器界面,该段代码主要功能是:初始化长度为100000的向量src,分别用计时器对循环使用系统函数库的sin函数求解以及调用KML_VML提供的向量三角函数vdsin求解,记录两种方法的耗时,对比KML_VML与系统函数库的性能。#include <stdio.h>#include <sys/time.h>#include <math.h>#include "kvml.h"#define LEN 100000int main(){ double src\[LEN\] = {0}; double dst1\[LEN\] = {0}; double dst2\[LEN\] = {0}; for(int i = 0; i < LEN; i++){ src\[i\] = i; } struct timeval start, end; long t;gettimeofday(&start, NULL); for(int i = 0; i < LEN; i++){ dst1\[i\] = sin(src\[i\]); }gettimeofday(&end, NULL); t = 100000 \* (end.tv\_sec - start.tv\_sec) + end.tv\_usec - start.tv\_usec; printf("Calculate Time without KML\_VML: %ld us \\n", t);gettimeofday(&start, NULL); vdsin(LEN, src, dst2);gettimeofday(&end, NULL); t = 100000 \* (end.tv\_sec - start.tv\_sec) + end.tv\_usec - start.tv\_usec; printf("Calculate Time with KML\_VML: %ld us \\n", t); return 0;}编译文件, 编译时添加动态库和头文件所在路径,并链接系统数学库和KML_VML动态库。gcc test\_sin.c -o test -L/usr/local/kml/lib/kvml/single -lkvml -lm -I/usr/local/kml/include -fopenmp -std=c99使用ldd指令检查程序依赖库是否准确链接。ldd test执行可执行文件,进行性能对比。./test结果显示,对于一个长度为100000的数组,用C语言的for循环实现求正弦函数值,需要6666微秒,而使用KML_VML仅需要779微秒,性能提升8倍。2. KML_BLAS测试BLAS(Basic Linear Algebra Subprograms)提供了一系列基本线性代数运算函数的标准接口,包括矢量线性组合、矩阵乘以矢量、矩阵乘以矩阵等功能。BLAS已被广泛的应用于工业界和科学计算,成为业界标准。KML_BLAS库提供BLAS函数的C语言接口。使用命令创建测试文件test_gemv.c文件。vi test_gemv.c进入到vim编辑器界面后,按下“i”键后,复制以下代码粘贴到编辑器中,复制完成后按下“ESC”键输入“:wq”,退出编辑器界面,该段代码主要功能是:初始化规模为1000*300的矩阵A,长度为300的向量x,长度为1000的向量y1和y2,分别用计时器对按照矩阵-向量的成家规则实现算法求解,即y=alpha*A*x+beta*y,以及调用KML_BLAS提供的函数cblas_dgemv求解,记录两种方法的耗时,对比KML_BLAS与手动实现矩阵乘加的性能。#include <stdio.h>#include <stdlib.h>#include <time.h>#include <sys/time.h>#include "kblas.h"#define M 1000#define N 300int main() { double alpha = 1.0; double beta = 1.0; double (\*A)\[N\] = (double (\*)\[N\])malloc(M \* N \* sizeof(double)); double \*x = (double \*)malloc(N \* sizeof(double)); double \*y1 = (double \*)malloc(M \* sizeof(double)); double \*y2 = (double \*)malloc(M \* sizeof(double)); srand((unsigned int)time(NULL)); for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { A\[i\]\[j\] = (double)rand() / RAND\_MAX; } } for (int i = 0; i < N; i++) { x\[i\] = (double)rand() / RAND\_MAX; } for (int i = 0; i < M; i++) { y1\[i\] = (double)rand() / RAND\_MAX; y2\[i\] = (double)rand() / RAND\_MAX; } // 方法一:按照矩阵-向量的乘加规则实现算法求解 struct timeval start, end; long t;gettimeofday(&start, NULL);for (int i = 0; i < M; i++) { double sum = 0.0; for (int j = 0; j < N; j++) { sum += A\[i\]\[j\] \* x\[j\]; } y1\[i\] = alpha \* sum + beta \* y1\[i\];}gettimeofday(&end, NULL); t = 100000 \* (end.tv\_sec - start.tv\_sec) + end.tv\_usec - start.tv\_usec; printf("Calculate Time without KML\_BLAS: %ld us \\n", t); // 方法二:调用KML\_BLAS提供的函数cblas\_dgemv求解gettimeofday(&start, NULL); cblas\_dgemv(CblasRowMajor, CblasNoTrans, M, N, alpha, (const double \*)A, N, x, 1, beta, y2, 1);gettimeofday(&end, NULL); t = 100000 \* (end.tv\_sec - start.tv\_sec) + end.tv\_usec - start.tv\_usec; printf("Calculate Time with KML\_BLAS: %ld us \\n", t); return 0;}编译文件,编译时添加动态库和头文件所在路径,并链接KML_BLAS动态库。gcc test\_gemv.c -g -o test2 -L /usr/local/kml/lib/kblas/locking/ -lkblas -I /usr/local/kml/include -std=c99使用ldd指令检查程序依赖库是否准确链接。ldd test2执行可执行文件,进行性能对比。./test2结果显示,计算一个1000*300的矩阵-向量乘加运算,用C语言的for循环实现,需要1904微秒,而使用KML_BLAS仅需要145微秒,性能提升13倍。至此,本次案例体验全部完成。
  • [技术干货] 在华为开发者空间,基于鲲鹏服务器的打砖块小游戏部署
    “【摘要】 鲲鹏服务器是基于鲲鹏处理器的新一代数据中心服务器,适用于大数据、分布式存储、高性能计算和数据库等应用。鲲鹏服务器具有高性能、低功耗、灵活的扩展能力,适合大数据分析、软件定义存储、Web等应用场景。”一、 案例介绍鲲鹏服务器是基于鲲鹏处理器的新一代数据中心服务器,适用于大数据、分布式存储、高性能计算和数据库等应用。鲲鹏服务器具有高性能、低功耗、灵活的扩展能力,适合大数据分析、软件定义存储、Web等应用场景。本案例将指导开发者如何在鲲鹏服务器部署并运行web小游戏。二、免费领取云主机如您还没有云主机,可点击链接 ,领取专属云主机后进行操作。如您已领取云主机,可直接开始实验。三、实验流程说明:1、自动部署鲲鹏服务器;2、使用终端连接鲲鹏服务器;3、创建html文件;4、启动Web服务器;5、体验游戏。四、实验资源本次实验预计花费总计0元。资源名称规格单价(元)时长(h)云主机2vCPUs | 4GB RAM免费1五、自动部署鲲鹏服务器1、在下载的更新包目录下点击鼠标右键选择“Open Terminal Here”,打开命令终端窗口。执行自动部署命令如下:hcd deploy --password abcd1234! --time 1800命令的参数说明:password:password关键字后设置的是鲲鹏服务器的root用户密码,命令中给出的默认为abcd1234!,开发者可以替换成自定义密码(至少8个字符)。time:time关键字后面设置的为鲲鹏服务器的可用时间,单位为秒,至少600秒。当前实验预估需要20分钟,为了保证时间充足,在命令中申请的时间为30分钟,即1800秒。该命令会自动部署鲲鹏服务器。首次部署会直接执行,旧资源未到期时重复部署,会提示是否删除前面创建的资源,可以删除旧资源再次部署。记录部署远端服务器公网IP,如截图中对应的就是:113.44.86.210。六、拷贝代码新打开一个命令窗口,在命令窗口中输入命令登录远端服务器,命令如下:ssh root@远端服务器公网IP输入密码,密码为步骤五中自动部署命令行中“--password”后面的参数,命令中给出的默认为abcd1234!,如果没有修改,就使用abcd1234!进行登录,如果设置了自定义密码,直接输入自定义的密码(注意:输入过程中密码不会显示,密码输入完成按回车键结束)。输入密码也可以借助剪切板进行复制粘贴,避免直接在命令窗口输入看不到输入内容而密码错误:登录成功后创建文件夹用于存放html文件,命令如下:mkdir gamecd gamevi game.html进入到Vim编辑器,按下键盘的“i”键进入到插入模式下,复制下列代码粘贴到编辑器中。(复制文档中代码时,如果包含页眉,请删除页眉部分!也可以通过链接下载代码)<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Arkanoid game</title> <style> body { display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background-color: #f0f0f0; } canvas { border: 5px solid #3498db; border-radius: 10px; } /* game start cues */ .game-start-text { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 24px; color: green; background-color: rgba(255, 255, 255, 0.8); padding: 10px; border-radius: 5px; } /* score display style */ .score-display { position: absolute; top: 20px; left: 50%; transform: translateX(-50%); font-size: 18px; color: #333; font-weight: bold; background-color: rgba(255, 255, 255, 0.7); padding: 5px 10px; border-radius: 5px; } </style></head><body><canvas id="gameCanvas" width="800" height="600"></canvas><div class="score-display" id="scoreDisplay">score:0</div><div id="gameStartText" class="game-start-text">start</div><audio id="hitBrickSound" preload="auto"> <source src="hitBrick.mp3" type="audio/mpeg"> Your browser does not support the audio element.</audio><audio id="hitPaddleSound" preload="auto"> <source src="hitPaddle.mp3" type="audio/mpeg"> Your browser does not support the audio element.</audio><audio id="gameOverSound" preload="auto"> <source src="gameOver.mp3" type="audio/mpeg"> Your browser does not support the audio element.</audio><script> const canvas = document.getElementById('gameCanvas'); const ctx = canvas.getContext('2d'); const ballRadius = 10; let x = canvas.width / 2; let y = canvas.height - 30; let dx = 3; let dy = -3; const paddleHeight = 10; const paddleWidth = 100; let paddleX = (canvas.width - paddleWidth) / 2; const brickRowCount = 10; const brickColumnCount = 15; const brickWidth = 48; const brickHeight = 20; const bricks = []; let score = 0; let gameStarted = false; for (let c = 0; c < brickColumnCount; c++) { bricks[c] = []; for (let r = 0; r < brickRowCount; r++) { bricks[c][r] = { x: 0, y: 0, status: 1 }; } } document.addEventListener('mousemove', mouseMoveHandler, false); document.addEventListener('click', startGame, false); function mouseMoveHandler(e) { if (gameStarted) { const relativeX = e.clientX - canvas.offsetLeft; if (relativeX > 0 && relativeX < canvas.width) { paddleX = relativeX - paddleWidth / 2; } } } function startGame() { if (!gameStarted) { gameStarted = true; document.getElementById('gameStartText').style.display = 'none'; draw(); } } function drawBall() { ctx.beginPath(); ctx.arc(x, y, ballRadius, 0, Math.PI * 2); ctx.fillStyle = '#0095DD'; ctx.fill(); ctx.closePath(); } function drawPaddle() { ctx.beginPath(); ctx.rect(paddleX, canvas.height - paddleHeight, paddleWidth, paddleHeight); ctx.fillStyle = '#0095DD'; ctx.fill(); ctx.closePath(); } function drawBricks() { for (let c = 0; c < brickColumnCount; c++) { for (let r = 0; r < brickRowCount; r++) { if (bricks[c][r].status === 1) { const brickX = c * (brickWidth + 2) + 20; const brickY = r * (brickHeight + 2) + 20; bricks[c][r].x = brickX; bricks[c][r].y = brickY; ctx.beginPath(); ctx.rect(brickX, brickY, brickWidth, brickHeight); ctx.fillStyle = '#0095DD'; ctx.fill(); ctx.closePath(); } } } } function collisionDetection() { for (let c = 0; c < brickColumnCount; c++) { for (let r = 0; r < brickRowCount; r++) { const b = bricks[c][r]; if (b.status === 1) { if (x > b.x && x < b.x + brickWidth && y > b.y && y < b.y + brickHeight) { dy = -dy; b.status = 0; score++; document.getElementById('scoreDisplay').textContent = 'score:' + score; const hitBrickSound = document.getElementById('hitBrickSound'); hitBrickSound.play(); } } } } } function draw() { ctx.clearRect(0, 0, canvas.width, canvas.height); if (gameStarted) { drawBricks(); drawBall(); drawPaddle(); collisionDetection(); x += dx; y += dy; if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) { dx = -dx; } if (y + dy < ballRadius) { dy = -dy; } else if (y + dy > canvas.height - ballRadius) { if (x > paddleX && x < paddleX + paddleWidth) { dy = -dy; const hitPaddleSound = document.getElementById('hitPaddleSound'); hitPaddleSound.play(); } else { const gameOverSound = document.getElementById('gameOverSound'); gameOverSound.play(); document.location.reload(); } } } requestAnimationFrame(draw); } draw();</script></body></html>按下ESC按钮退出编辑模式,输入“:wq”,退出并保存game.html文件。七、安装软件包安装Python3,命令如下:sudo yum install -y python3 安装成功后检查Python3版本确认是否安装成功。python3 --version八、浏览器访问在当前存放代码的路径下,使用Python3启动一个简单的Web服务器,命令如下:python3 -m http.server如下图所示,代表当前Web服务器已经启动。打开火狐浏览器,在地址栏输入“http://弹性云服务器IP:8000/game.html”即可体验游戏。至此实验全部完成。
  • [技术干货] 鲲鹏DevKit,助力开发者基于鲲鹏服务器实现一站式应用开发
    “【摘要】 鲲鹏DevKit针对不同的业务场景,提供了应用迁移和系统迁移两套解决方案,帮忙开发者快速从X86平台迁移至鲲鹏平台,通过详细的迁移建议降低迁移门槛,可视化展示迁移进度,打消鲲鹏平台开发的顾虑。”在DTSE Tech Talk技术直播课第69期《鲲鹏DevKit,助力开发者基于鲲鹏服务器实现一站式应用开发》中,华为鲲鹏DTSE技术布道师Hank Hou,与鲲鹏生态开发者交流如何在鲲鹏服务器上快速开展应用开发,跟大家分享鲲鹏DevKit工具链的特性功能,以及这些特性功能能够解决哪些开发中遇到的问题,助力鲲鹏生态快速发展。鲲鹏生态开发面临的挑战开发者在基于鲲鹏服务器进行应用开发时,面临软件跨平台迁移的挑战,包括指令差异、性能调优、服务器性能瓶颈等问题。人工分析投入大、周期长,对专业技能要求高,反复定位试错效率低。• 软件迁移的挑战:人工分析:人工检索软件依赖的第三方软件,并替换鲲鹏版本,工作量巨大编译选项:人工逐行筛查,需编译运行后才能发现兼容性问题移植的汇编代码:对技能要求高,需汇编指令集、一个个去替换从迁移到调优的整个过程都很繁琐:周期长、效率低、技术门槛高• 性能调优的挑战:性能工具零散:没有一站式全量性能统计工具,对于CPU、网卡等设备需要不同的调优工具学习成本高:众多工具学习成本高,数据不互通,无法全局分析依赖经验:对于应用的深度调优,依赖开发人员的技术储备应用+系统极速迁移方案针对鲲鹏生态开发遇到的挑战,鲲鹏DevKit针对不同的业务场景,提供了应用迁移和系统迁移两套解决方案,帮忙开发者快速从X86平台迁移至鲲鹏平台,通过详细的迁移建议降低迁移门槛,可视化展示迁移进度,打消鲲鹏平台开发的顾虑。1. 应用迁移快速扫描海量代码,提供专业迁移指导报告,自动分析出需修改的代码内容,给出修改建议;无源码应用基于ExaGear动态二进制翻译工具,低成本解决应用的平滑迁移,释放鲲鹏平台澎湃算力。2. 系统迁移全栈迁移能力,自动采集和分析系统成分,实现OS和主流中间件自动迁移、主流商业数据库自动部署、应用层待迁移信息全量扫描并指导修改,助力业务系统快速迁移。全流程开发工具助力极简开发鲲鹏DevKit为开发者提供了全流程的开发工具,从代码开发、性能调优、测试诊断、流水线等代码开发各个阶段,均提供了对应的开发工具,助力开发者持续且首发性能领先的鲲鹏商用版本,加速原生开发。1. 开发• 鲲鹏DevKit针对高频开发场景提供场景化SDK、代码样例,功能齐全、注释完整,帮助开发者快速上手鲲鹏开发• 鲲鹏亲和检查,多维度扫描优化打造鲲鹏亲和应用• 面向不同技术路线,提供三款鲲鹏架构优化的编译器工具链,包括毕昇编译器、毕昇JDK、GCC for openEuler• Java UT用例自动生成支持一键自动生成Java全量测试用例,核心代码行覆盖率80%,支持增量UT生成快速拦截代码改动引入的质量问题,保障业务质量2. 性能调优• 自动采集系统数据,分析出系统性能指标,定位到瓶颈点及热点函数,给出调优建议,从而达到软件和鲲鹏平台融合的最佳性能。• AITunner:AI on CPU加持场景化调优,性能平均提升20%• 性能采集库(libkperf) 以内存方式管理采集数据,减少IO开销;提供通用化接口设计,便于使用;与linux发行版解耦,轻依赖,低耦合,可兼容多OS3. 系统诊断分析系统运行指标,识别异常点,例如:内存泄漏、内存越界、网络丢包等,并给出优化建议。支持压测系统,如:网络IO、存储IO,评估系统最大性能。4. 快速接入流水线基于鲲鹏硬件+openEuler+鲲鹏DevKit +鲲鹏BoostKit构建1套软件工程流水线,实现1套代码开发、多平台运行,助力伙伴持续且首发性能领先的鲲鹏商用版本鲲鹏DevKit为开发者提供了一套全面的工具和解决方案,以实现高效、快速的应用迁移和开发,特别是在高性能计算、金融、大数据、云计算等领域。通过自动化、智能化的方法,DevKit显著提升了开发效率和软件性能,降低了开发和维护成本。
  • [开源for鲲鹏云] 在鲲鹏CPU和HCE系统下部署运行QAnything 2.0
    资源购买资源名称规格操作系统存储ECS鲲鹏内存优化型 km1.xlarge.8 4vCPUs 32GiBHuawei Cloud EulerOS 2.0 标准版 64位 ARM版系统盘:超高IO,100GiB基础软件安装Condamkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh -O ~/miniconda3/miniconda.sh bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3 rm -f ~/miniconda3/miniconda.sh source ~/miniconda3/bin/activate conda init --allPython & Pip官方默认安装的python版本为3.99,版本比较低,这里使用Conda创建一个3.10的虚拟环境。conda create -n QAnything python=3.10 conda activate QAnything # 设置 pip软件源 pip config set global.index-url https://repo.huaweicloud.com/repository/pypi/simple python -m pip install --upgrade pipDocker & Docker Compose官方默认安装的docker版本为18.09.0,版本比较低,很多新的特性无法使用,如docker-buildx等,建议升级到最新版本。因为官方并未提供Huawei Cloud EulerOS 2.0的repo支持,所以可以采取以下方式进行安装。如果之前安装过docker,要先删掉之后再安装依赖sudo dnf remove docker docker-ce-cli docker-selinux docker-engine下载repo文件wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo sudo sed -i 's+download.docker.com+mirrors.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo sudo sed -i 's+$releasever+9.9+' /etc/yum.repos.d/docker-ce.repo安装新版本sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin设置开机启动sudo systemctl enable --now docker配置镜像加速器vi /etc/docker/daemon.json # 粘贴以下配置,保存退出,镜像地址可替换成自己在华为云申请的镜像加速器地址 { "registry-mirrors": [ "https://docker.1ms.run", "https://docker.xuanyuan.me"] } 重启dockersystemctl restart docker下载QAnything源码git clone https://github.com/netease-youdao/QAnything.git官方的docker镜像xixihahaliu01/qanything-linux:v1.5.1 是在X86的服务器下构建的,无法在ARM架构下运行,需要手动构建Docker镜像。构建QAnything镜像进入build_images,查看Dockerfile,可以得到以下几点信息Dockerfile文件要移动到父目录下才能构建需要准备models、nltk_data文件夹数据# 复制 requirements.txt 文件到容器中 COPY requirements.txt /tmp/requirements.txt # 复制 models 文件夹到 /root 目录 COPY models /root/models COPY nltk_data /root/nltk_data想知道model文件夹下要准备什么数据就要看这个文件复制到容器后是如何使用的,通过docker-compose-linux.yaml 可知,运行qanything-container-local容器时会执行/bin/bash -c "cd /workspace/QAnything && bash scripts/entrypoint.sh",打开script/entrypoint.sh,其中跟/root/models和/root/nltk_data有关的信息如下:# 创建软连接 if [ ! -L "/workspace/QAnything/qanything_kernel/dependent_server/embedding_server/embedding_model_configs_v0.0.1" ]; then # 如果不存在软连接 cd /workspace/QAnything/qanything_kernel/dependent_server/embedding_server && ln -s /root/models/linux_onnx/embedding_model_configs_v0.0.1 . fi if [ ! -L "/workspace/QAnything/qanything_kernel/dependent_server/rerank_server/rerank_model_configs_v0.0.1" ]; then # 如果不存在软连接 cd /workspace/QAnything/qanything_kernel/dependent_server/rerank_server && ln -s /root/models/linux_onnx/rerank_model_configs_v0.0.1 . fi if [ ! -L "/workspace/QAnything/qanything_kernel/dependent_server/ocr_server/ocr_models" ]; then # 如果不存在软连接 cd /workspace/QAnything/qanything_kernel/dependent_server/ocr_server && ln -s /root/models/ocr_models . # 创建软连接 fi if [ ! -L "/workspace/QAnything/qanything_kernel/dependent_server/pdf_parser_server/pdf_to_markdown/checkpoints" ]; then # 如果不存在软连接 cd /workspace/QAnything/qanything_kernel/dependent_server/pdf_parser_server/pdf_to_markdown/ && ln -s /root/models/pdf_models checkpoints # 创建软连接 fi if [ ! -L "/workspace/QAnything/nltk_data" ]; then # 如果不存在软连接 cd /workspace/QAnything/ && ln -s /root/nltk_data . # 创建软连接 fi从脚本内容结合官方README可知,models文件夹中要准备embedding、rerank、ocr、pdf四个模型,nltk_data下要准备nltk 数据model文件夹下要准备的数据下面下载模型数据都是在QAnything目录下执行安装modelscopepip install modelscopebce-embedding-base_v1modelscope download --model netease-youdao/bce-embedding-base_v1 --local_dir ./models/linux_onnx/embedding_model_configs_v0.0.1bce-reranker-base_v1modelscope download --model netease-youdao/bce-reranker-base_v1 --local_dir ./models/linux_onnx/rerank_model_configs_v0.0.1pdf_models和ocr_modelmodelscope download --model netease-youdao/QAnything-pdf-parser --local_dir ./models/pdf_modelspdf_models中已经包含了ocr,可以重用,这里要改下entrypoint.sh中ocr_models路径if [ ! -L "/workspace/QAnything/qanything_kernel/dependent_server/ocr_server/ocr_models" ]; then # 如果不存在软连接 cd /workspace/QAnything/qanything_kernel/dependent_server/ocr_server && ln -s /root/models/pdf_models/ocr ocr_models # 创建软连接 finltk_data文件夹下要准备的数据modelscope download --dataset CaiJichang/nltk_data --local_dir ./nltk_data构建之前需要对项目中的一些文件做些优化。Dockfile优化在QAnything目录下创建新的Dockerfilevi Dockerfile # 添加以下内容 # 使用官方 Python 3.10.14 镜像作为基础镜像 FROM python:3.10-slim # 替换APT源 RUN sed -i 's/http:\/\/deb.debian.org\//https:\/\/mirrors.huaweicloud.com\//g' /etc/apt/sources.list.d/debian.sources # 设置时区 ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 安装 RUN apt-get update && apt-get install -y \ vim \ wget \ htop \ build-essential \ procps \ && rm -rf /var/lib/apt/lists/\* # 创建TikToken缓存目录 RUN mkdir /opt/tiktoken_cache # 下载TikToken模型缓存 ARG TIKTOKEN_URL="https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken" RUN wget -O /opt/tiktoken_cache/$(echo -n $TIKTOKEN_URL | sha1sum | head -c 40) "$TIKTOKEN_URL" # 设置环境变量指向TikToken缓存目录 ENV TIKTOKEN_CACHE_DIR=/opt/tiktoken_cache # 复制 requirements.txt 文件到容器中 COPY requirements.txt /tmp/requirements.txt RUN pip config set global.index-url https://repo.huaweicloud.com/repository/pypi/simple \ && python -m pip install --upgrade pip # 安装 Python 依赖(torch单独安装CPU版本) RUN pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu \ && pip install -r /tmp/requirements.txt # 复制 models 文件夹到 /root 目录 COPY models /root/models COPY nltk_data /root/nltk_data # 设置工作目录 WORKDIR /workspace # 清理 APT 缓存 RUN apt-get clean && rm -rf /var/lib/apt/lists/\* # 设置默认命令 CMD ["/bin/bash"] requirements.txt优化默认的依赖包中会安装CUDA依赖,本次我们是纯CPU部署,不需要这些。vi requirements.txt # 添加以下内容 onnxruntime==1.17.1 xgboost-cpu==3.0.0 concurrent-log-handler==0.9.25 boto3==1.34.79 sanic==23.6.0 sanic_ext==23.6.0 langchain-openai==0.3.7 langchain_elasticsearch==0.3.2 langchain-community==0.3.18 unstructured==0.12.4 unstructured[pptx]==0.12.4 unstructured[md]==0.12.4 opencv-python-headless==4.9.0.80 python-dotenv==1.0.1 mysql-connector-python==8.2.0 pymilvus==2.5.5 aiomysql==0.2.0 PyMuPDF==1.24.4 openpyxl==3.1.2 python-docx==1.1.0 newspaper4k==0.9.3.1 newspaper4k[zh]==0.9.3.1 duckduckgo-search==5.3.0b4 html2text==2024.2.26 mistune==3.0.2 flair==0.13.0 nltk==3.8.1 pandas==2.1.1 scikit-learn==1.3.2 chardet==5.2.0 scipy==1.10.1 fastchat==0.1.0 wikipedia==1.4.0 Wikipedia-API==0.6.0 rouge-score==0.1.2 toml==0.10.2 tqdm==4.66.1 anthropic==0.25.7 streamlit==1.34.0 zhipuai==2.0.1.20240429 tiktoken==0.7.0 modelscope==1.13.0 cryptography==42.0.8 shapely==2.0.4 pyclipper==1.3.0.post5 pdfplumber==0.11.0 markdownify==0.12.1 datrie==0.8.2 hanziconv==0.3.2 PyPDF2==3.0.1 lxml_html_clean==0.1.1 docx2txt==0.8 构建docker镜像# 在QAnything目录下执行 docker build -t xixihahaliu01/qanything-linux:v1.5.1 . docker-compose-linux.yaml优化在qanything_local下的volumes,其实不用把整个QAnything映射到容器中,只需要映射需要的文件即可 volumes: - ${DOCKER_VOLUME_DIRECTORY:-.}/qanything_kernel:/workspace/QAnything/qanything_kernel - ${DOCKER_VOLUME_DIRECTORY:-.}/logs:/workspace/QAnything/logs - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes:/workspace/QAnything/volumes - ${DOCKER_VOLUME_DIRECTORY:-.}/QANY_DB:/workspace/QAnything/QANY_DB - ${DOCKER_VOLUME_DIRECTORY:-.}/scripts/entrypoint.sh:/workspace/QAnything/scripts/entrypoint.sh代码优化qanything_kernel/core/retriever/vectorstore.py@get_time def delete_expr(self, expr): # 如果expr为空,则不执行删除操作 result = self.get_local_chunks(expr) if result is None or len(result) == 0: debug_logger.info(f'expr: {expr} not found in local milvus') return qanything_kernel/dependent_server/embedding_server/embedding_server.py 和 qanything_kernel/dependent_server/rerank_server/rerank_server.py增加以下代码from sanic.worker.manager import WorkerManager WorkerManager.THRESHOLD = 600 qanything_kernel/configs/model_config.py增加以下配置DEFAULT_PROMPT_TEMPLATE = """ 参考信息: {{context}} --- 我的问题或指令: {{question}} --- 请根据上述参考信息回答我的问题或回复我的指令。前面的参考信息可能有用,也可能没用,你需要从我给出的参考信息中选出与我的问题最相关的那些,来为你的回答提供依据。回答一定要忠于原文,简洁但不丢信息,不要胡乱编造。我的问题或指令是什么语种,你就用什么语种回复,你的回复: """ # 匹配后单段上下文长度 CHUNK_SIZE = 800 修改以下配置# 知识库检索时返回的匹配内容条数 VECTOR_SEARCH_TOP_K = 5 # embedding检索的相似度阈值,归一化后的L2距离,设置越大,召回越多,设置越小,召回越少 VECTOR_SEARCH_SCORE_THRESHOLD = 0.5 qanything_kernel/core/local_doc_qa.py # 在下面语句后增加 DEFAULT_PROMPT_TEMPLATE from qanything_kernel.configs.model_config import DEFAULT_PROMPT_TEMPLATE # 586~592做以下修改 if custom_prompt: # prompt_template = CUSTOM_PROMPT_TEMPLATE.replace("{{custom_prompt}}", custom_prompt) prompt_template = custom_prompt else: # system_prompt = SYSTEM.replace("{{today_date}}", today).replace("{{current_time}}", now) # prompt_template = PROMPT_TEMPLATE.replace("{{system}}", system_prompt).replace("{{instructions}}",INSTRUCTIONS) prompt_template = DEFAULT_PROMPT_TEMPLATE 启动项目run.sh 修改# 修改run.sh 93行 source ./.env启动# 在QAnything目录下执行 bash run.sh出现以下信息表示启动成功了访问项目在运行run.sh过程中会询问是在本地部署还是云服务上部署,如果是云服务器部署,就填入弹性IP的地址即可。体验项目新建知识库上传文档目前支持文件格式md、txt、pdf、jpg、png、jpeg、docx、xlsx、pptx、eml、csv, 单个文档小于30M, 单张图片小于5M, 文件总大小不得超过125M.文档越大,处理时间越长.备注中可以看大部分时间都耗费在embedding中,如果文档太大也可能会超时导致失败.预览切片结果PDF文件的解析原理是将其转换成Markedown文件,这可以最大限度保证原版的样式和内容.可以对照源文件对比查看,支持编辑修改.配置LLM大模型这里使用华为云ModelArts Studio大模型服务来作为LLM的提供商进入产品官网ModelArts Studio在API Key管理菜单项中申请一个Api Key进入在线推理菜单项,领取大模型服务免费额度进入对应服务的调用说明获取调用参数配置模型提供商问答会话接下来就可以进行问答会话了,这里用的是外部LLM服务,响应还是非常快的.
  • [问题求助] 鲲鹏920的64核云实例在高并发场景(如Web服务器、大数据处理)下,如何通过NUMA绑定或调度策略减少核间延迟?
    鲲鹏920的64核云实例在高并发场景(如Web服务器、大数据处理)下,如何通过NUMA绑定或调度策略减少核间延迟?