• [技术干货] 【实战案例】在开发者空间的鲲鹏云主机上编译并部署Flink,来实现大数据的实时统计、计算和分析
    一、项目背景1.1 软件介绍Apache Flink 是一个开源的流处理框架,具有高吞吐、低延迟、可容错等特点,可同时支持批处理和流处理,为数据处理提供了强大而灵活的解决方案,Flink在 Docker中的应用场景主要是为了简化集群的部署和管理,特别是在开发、测试以及小规模生产环境中。使用 Docker 可以快速启动、停止和重启集群,避免手动配置和依赖管理的复杂性。Flink实时统计功能可以应用在以下场景:实时数据清洗和转换:在数据进入存储或分析系统之前,需要对原始数据进行清洗和转换,以确保数据的质量和一致性。实时事件监测与告警:在实时监控系统中,当某些事件满足特定条件时触发告警。实时推荐系统;根据用户的实时行为和偏好,为用户提供个性化推荐。1.2 架构介绍   本案例通过云主机进行Docker部署和安装Flink,在CodeArts IDE编辑器进行代码开发实现数据的实时统计。 二、安装步骤2.1 安装Docker本案例中,使用Docker简化集群的部署和管理,提高开发效率、保证环境一致性、降低成本、提高安全性和可靠性,同时也支持复杂的架构和部署模式。打开云主机命令行窗口输入以下命令,更新软件包。如果出现“无法获得锁,锁正由unattended持有”请等待一会重试。sudo apt updatesudo apt upgrade -y卸载旧版本Docker(如果已安装)。sudo apt-get remove docker docker-engine docker.io containerd runc安装必要的依赖。sudo apt install apt-transport-https ca-certificates curl software-properties-common添加Docker的官方GPG密钥,如果添加失败可等待几分钟重试几次。sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -注意:如果频繁失败,可以使用华为镜像站软件源替第4、5步骤中的Docker官方地址,命令如下:sudo curl -fsSL https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add –sudo add-apt-repository "deb [arch=amd64] https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"添加Docker的APT源。sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"执行命令后需要按”ENTER“键继续执行命令。更新APT包索引。sudo apt update安装Docker CE。sudo apt install docker-ce验证Docker是否安装成功。sudo systemctl status docker设置Docker自动启动。sudo systemctl enable docker安装docker-compose。sudo apt-get install docker-compose2.2 拉取Flink镜像Apache Flink 是一个功能强大的流处理框架,适用于各种实时数据处理和分析场景,它提供了强大的功能和丰富的 API,支持分布式、高性能、低延迟和精确一次的处理,在现代数据处理领域发挥着重要的作用。使用以下命令从 OBS下载指定版本的 Flink 镜像,并将镜像加载到本地的Docker镜像库中。sudo wget https://dtse-mirrors.obs.cn-north-4.myhuaweicloud.com/case/0029/overseas/flink_image.tarsudo docker load -i flink_image.tar启动 Flink 集群创建一个目录用于存放 Flink 集群的相关文件。mkdir ~/flink && cd ~/flink创建 Docker Compose 文件在~/flink目录下创建一个名为 docker-compose.yml 的文件。vim docker-compose.yml文件内容如下:version: '3'services: jobmanager: image: flink:1.16.3-scala_2.12-java8 hostname: jobmanager container_name: jobmanager ports: - "8081:8081" environment: - | FLINK_PROPERTIES= jobmanager.rpc.address: jobmanager parallelism.default: 1 command: jobmanager taskmanager: image: flink:1.16.3-scala_2.12-java8 hostname: taskmanager container_name: taskmanager environment: - | FLINK_PROPERTIES= jobmanager.rpc.address: jobmanager taskmanager.numberOfTaskSlots: 2 parallelism.default: 1 depends_on: - jobmanager command: taskmanager配置代理在 Docker 的配置文件中添加华为镜像加速器。sudo vim /etc/docker/daemon.json配置信息如下:{ "registry-mirrors": [ "https://7046a839d8b94ca190169bc6f8b55644.mirror.swr.myhuaweicloud.com" ]}重启docker。sudo systemctl restart docker启动 Flink 集群通过以下命令启动 Flink 集群:sudo docker-compose up -d等待容器启动后,你可以通过访问 http://localhost:8081 来打开 Flink 的 Web 界面,以检查集群是否成功启动。修改配置文件,保证日志正常打印执行如下命令复制taskmanager下的docker-entrypoint.sh脚本。sudo docker cp taskmanager:/docker-entrypoint.sh ./docker-entrypoint.sh替换配置文件。vim docker-entrypoint.sh配置文件如下:#!/usr/bin/env bash################################################################################ Licensed to the Apache Software Foundation (ASF) under one# or more contributor license agreements. See the NOTICE file# distributed with this work for additional information# regarding copyright ownership. The ASF licenses this file# to you under the Apache License, Version 2.0 (the# "License"); you may not use this file except in compliance# with the License. You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.###############################################################################COMMAND_STANDALONE="standalone-job"COMMAND_HISTORY_SERVER="history-server"# If unspecified, the hostname of the container is taken as the JobManager addressJOB_MANAGER_RPC_ADDRESS=${JOB_MANAGER_RPC_ADDRESS:-$(hostname -f)}CONF_FILE="${FLINK_HOME}/conf/flink-conf.yaml"drop_privs_cmd() { if [ $(id -u) != 0 ]; then # Don't need to drop privs if EUID != 0 return elif [ -x /sbin/su-exec ]; then # Alpine echo su-exec flink else # Others echo gosu flink fi}copy_plugins_if_required() { if [ -z "$ENABLE_BUILT_IN_PLUGINS" ]; then return 0 fi echo "Enabling required built-in plugins" for target_plugin in $(echo "$ENABLE_BUILT_IN_PLUGINS" | tr ';' ' '); do echo "Linking ${target_plugin} to plugin directory" plugin_name=${target_plugin%.jar} mkdir -p "${FLINK_HOME}/plugins/${plugin_name}" if [ ! -e "${FLINK_HOME}/opt/${target_plugin}" ]; then echo "Plugin ${target_plugin} does not exist. Exiting." exit 1 else ln -fs "${FLINK_HOME}/opt/${target_plugin}" "${FLINK_HOME}/plugins/${plugin_name}" echo "Successfully enabled ${target_plugin}" fi done}set_config_option() { local option=$1 local value=$2 # escape periods for usage in regular expressions local escaped_option=$(echo ${option} | sed -e "s/\./\\\./g") # either override an existing entry, or append a new one if grep -E "^${escaped_option}:.*" "${CONF_FILE}" > /dev/null; then sed -i -e "s/${escaped_option}:.*/$option: $value/g" "${CONF_FILE}" else echo "${option}: ${value}" >> "${CONF_FILE}" fi}prepare_configuration() { set_config_option jobmanager.rpc.address ${JOB_MANAGER_RPC_ADDRESS} set_config_option blob.server.port 6124 set_config_option query.server.port 6125 if [ -n "${TASK_MANAGER_NUMBER_OF_TASK_SLOTS}" ]; then set_config_option taskmanager.numberOfTaskSlots ${TASK_MANAGER_NUMBER_OF_TASK_SLOTS} fi if [ -n "${FLINK_PROPERTIES}" ]; then echo "${FLINK_PROPERTIES}" >> "${CONF_FILE}" fi envsubst < "${CONF_FILE}" > "${CONF_FILE}.tmp" && mv "${CONF_FILE}.tmp" "${CONF_FILE}"}maybe_enable_jemalloc() { if [ "${DISABLE_JEMALLOC:-false}" == "false" ]; then JEMALLOC_PATH="/usr/lib/$(uname -m)-linux-gnu/libjemalloc.so" JEMALLOC_FALLBACK="/usr/lib/x86_64-linux-gnu/libjemalloc.so" if [ -f "$JEMALLOC_PATH" ]; then export LD_PRELOAD=$LD_PRELOAD:$JEMALLOC_PATH elif [ -f "$JEMALLOC_FALLBACK" ]; then export LD_PRELOAD=$LD_PRELOAD:$JEMALLOC_FALLBACK else if [ "$JEMALLOC_PATH" = "$JEMALLOC_FALLBACK" ]; then MSG_PATH=$JEMALLOC_PATH else MSG_PATH="$JEMALLOC_PATH and $JEMALLOC_FALLBACK" fi echo "WARNING: attempted to load jemalloc from $MSG_PATH but the library couldn't be found. glibc will be used instead." fi fi}maybe_enable_jemalloccopy_plugins_if_requiredprepare_configurationargs=("$@")if [ "$1" = "help" ]; then printf "Usage: $(basename "$0") (jobmanager|${COMMAND_STANDALONE}|taskmanager|${COMMAND_HISTORY_SERVER})\n" printf " Or $(basename "$0") help\n\n" printf "By default, Flink image adopts jemalloc as default memory allocator. This behavior can be disabled by setting the 'DISABLE_JEMALLOC' environment variable to 'true'.\n" exit 0elif [ "$1" = "jobmanager" ]; then args=("${args[@]:1}") echo "Starting Job Manager" exec $(drop_privs_cmd) "$FLINK_HOME/bin/jobmanager.sh" start-foreground "${args[@]}"elif [ "$1" = ${COMMAND_STANDALONE} ]; then args=("${args[@]:1}") echo "Starting Job Manager" exec $(drop_privs_cmd) "$FLINK_HOME/bin/standalone-job.sh" start-foreground "${args[@]}"elif [ "$1" = ${COMMAND_HISTORY_SERVER} ]; then args=("${args[@]:1}") echo "Starting History Server" exec $(drop_privs_cmd) "$FLINK_HOME/bin/historyserver.sh" start-foreground "${args[@]}"elif [ "$1" = "taskmanager" ]; then args=("${args[@]:1}") echo "Starting Task Manager" $FLINK_HOME/bin/taskmanager.sh start "$@"fisleep 1exec /bin/bash -c "tail -f $FLINK_HOME/log/*.log"args=("${args[@]}")# Running command in pass-through modeexec $(drop_privs_cmd) "${args[@]}"修改后如下图:将修改后的配置文件再上传到taskmanager。sudo docker cp ./docker-entrypoint.sh taskmanager:/docker-entrypoint.sh重启服务。sudo docker-compose restart查看服务状态。sudo docker ps -a2.3 安装Java环境jdk1.8的安装包如下,请把压缩格式的文件jdk-8u391-linux-aarch64.tar.gz下载到云主机复制下面链接到浏览器下载。cid:link_0把安装包上传到/home/developer/Downloads的目录下执行如下命令:sudo mkdir -p /usr/lib/jvm #创建/usr/lib/jvm目录用来存放JDK文件sudo tar -zxvf /home/developer/Downloads/jdk-8u391-linux-aarch64.tar.gz -C /usr/lib/jvm #把JDK文件解压到/usr/lib/jvm目录下JDK文件解压缩以后,可以执行如下命令到/usr/lib/jvm目录查看一下:cd /usr/lib/jvmls可以看到,在/usr/lib/jvm目录下有个jdk1.8.0_391目录。下面继续执行如下命令,设置环境变量:cd ~vim ~/.bashrc使用vim编辑器,打开了developer这个用户的环境变量配置文件,请在这个文件的开头位置,添加如下几行内容:export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_391export JRE_HOME=${JAVA_HOME}/jreexport CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/libexport PATH=${JAVA_HOME}/bin:$PATH保存.bashrc文件并退出vim编辑器。然后,继续执行如下命令让.bashrc文件的配置立即生效:source ~/.bashrc这时,可以使用如下命令查看是否安装成功:java -version如果能够在屏幕上返回如下信息,则说明安装成功:至此,就成功安装了Java环境。2.4 代码开发双击打开桌面上的CodeArts IDE for JAVA。点击新建工程。工程信息如下:名称:自定义位置:默认构建系统:MavenJDK:1.8配置settings.xml文件,在命令行执行:vim /home/developer/.m2/settings.xml将内容替换如下:<?xml version="1.0" encoding="UTF-8"?><settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <!-- 默认的值是${user.home}/.m2/repository --> <!--<localRepository></localRepository>--> <!-- 如果Maven要试图与用户交互来得到输入就设置为true,否则就设置为false,默认为true。 --> <!-- <interactiveMode>true</interactiveMode> --> <!-- 如果Maven使用${user.home}/.m2/plugin-registry.xml来管理plugin的版本,就设置为true,默认为false。 --> <!-- <usePluginRegistry>false</usePluginRegistry> --> <!-- 如果构建系统要在离线模式下工作,设置为true,默认为false。 如果构建服务器因为网络故障或者安全问题不能与远程仓库相连,那么这个设置是非常有用的。 --> <!-- <offline>false</offline> --> <servers> <!-- server | Specifies the authentication information to use when connecting to a particular server, identified by | a unique name within the system (referred to by the 'id' attribute below). | | NOTE: You should either specify username/password OR privateKey/passphrase, since these pairings are | used together. | --> <!-- server标签的作用 ,如下 --> <!-- 使用mvn install时,会把项目打的包安装到本地maven仓库 --> <!-- 使用mvn deploye时,会把项目打的包部署到远程maven仓库,这样有权限访问远程仓库的人都可以访问你的jar包 --> <!-- 通过在pom.xml中使用 distributionManagement 标签,来告知maven 部署的远程仓库地址,--> </servers> <mirrors> <mirror> <id>huaweiyun</id> <mirrorOf>*</mirrorOf><!--*代表所有的jar包都到华为云下载--> <!--<mirrorOf>central</mirrorOf>--><!--central代表只有中央仓库的jar包才到华为云下载--> <!-- maven 会有默认的id为 “central” 的中央仓库--> <name>huaweiyun-maven</name> <url>https://mirrors.huaweicloud.com/repository/maven/</url> </mirror> </mirrors> <!-- settings.xml中的profile是pom.xml中的profile的简洁形式。 它包含了激活(activation),仓库(repositories),插件仓库(pluginRepositories)和属性(properties)元素。profile元素仅包含这四个元素是因为他们涉及到整个的构建系统,而不是个别的POM配置。 如果settings中的profile被激活,那么它的值将重载POM或者profiles.xml中的任何相等ID的profiles。 --> <!-- 如果setting中配置了 repository,则等于项目的pom中配置了 --> <profiles> <profile> <!-- 指定该 profile的id --> <id>dev</id> <!-- 远程仓库--> <repositories> <!-- 华为云远程仓库--> <repository> <id>huaweicloud</id> <name>huaweicloud maven Repository</name> <url>https://mirrors.huaweicloud.com/repository/maven/</url> <!-- 只从该仓库下载 release版本 --> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>spring-milestone</id> <name>Spring Milestone Repository</name> <url>https://repo.spring.io/milestone</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> <layout>default</layout> </repository> <repository> <id>spring-snapshot</id> <name>Spring Snapshot Repository</name> <url>https://repo.spring.io/snapshot</url> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> <layout>default</layout> </repository> </repositories> <pluginRepositories> <!-- 插件仓库。插件从这些仓库下载 --> <pluginRepository> <id>huaweicloud</id> <url>https://mirrors.huaweicloud.com/repository/maven/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles> <!-- activations是profile的关键,就像POM中的profiles,profile的能力在于它在特定情况下可以修改一些值。而这些情况是通过activation来指定的。 --> <!-- <activeProfiles/> --> <activeProfiles> <activeProfile>dev</activeProfile> </activeProfiles></settings>配置pom文件:文件内容如下:<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <name>flinkdemo</name> <groupId>com.example</groupId> <artifactId>flinkdemo</artifactId> <version>1.0-SNAPSHOT</version> <description></description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <flink.version>1.16.3</flink.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-streaming-java --><dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java</artifactId> <version>1.16.3</version> <scope>provided</scope></dependency><dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-java</artifactId> <version>1.16.3</version> <!-- 根据实际需求选择版本 --></dependency><dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-clients</artifactId> <version>1.16.3</version></dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-shaded-hadoop-2-uber</artifactId> <version>2.7.5-10.0</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> </dependency> </dependencies><repositories> <repository> <id>central</id> <url>https://repo.maven.apache.org/maven2/</url> </repository></repositories> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>8</source> <target>8</target> </configuration> </plugin> </plugins> </build></project>配置完之后,点击右边MAVEN刷新按钮,下载依赖。打开项目工程,删除App.java。新建WordCount.java类。代码如下: package com.example;import org.apache.flink.api.common.RuntimeExecutionMode;import org.apache.flink.api.common.functions.FlatMapFunction;import org.apache.flink.api.common.functions.MapFunction;import org.apache.flink.api.java.functions.KeySelector;import org.apache.flink.api.java.tuple.Tuple2;import org.apache.flink.streaming.api.datastream.DataStream;import org.apache.flink.streaming.api.datastream.DataStreamSource;import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;//import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;import org.apache.flink.util.Collector;import java.util.Random;public class WordCount { /** * 1. env-准备环境 * 2. source-加载数据 * 3. transformation-数据处理转换 * 4. sink-数据输出 * 5. execute-执行 */ public static void main(String[] args) throws Exception { // 导入常用类时要注意 不管是在本地开发运行还是在集群上运行,都这么写,非常方便 //StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 后续的数据源、转换、操作等代码 // env.execute("WordCount01"); // 这个是 自动 ,根据流的性质,决定是批处理还是流处理 //env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC); // 批处理流, 一口气把数据算出来 // env.setRuntimeMode(RuntimeExecutionMode.BATCH); // 流处理,默认是这个 可以通过打印批和流的处理结果,体会流和批的含义 env.setRuntimeMode(RuntimeExecutionMode.STREAMING); // 获取数据 多态的写法 DataStreamSource 它是 DataStream 的子类 // 定义一个用于生成随机单词的数组 /* String[] words = {"apple", "banana", "cherry", "date", "elderberry"}; Random random = new Random(); // 这里使用一个无限循环来模拟持续生成数据 while (true) { // 随机选择一个单词 String word = words[random.nextInt(words.length)]; */ // DataStream<String> dataStream01 = env.fromElements("spark flink kafka", "spark sqoop flink", "kakfa hadoop flink"); DataStream<String> dataStream01 = env.socketTextStream("xxx.xxx.xxx.xxx", 9999); DataStream<String> flatMapStream = dataStream01.flatMap(new FlatMapFunction<String, String>() { @Override public void flatMap(String line, Collector<String> collector) throws Exception { String[] arr = line.split(" "); for (String word : arr) { // 循环遍历每一个切割完的数据,放入到收集器中,就可以形成一个新的DataStream collector.collect(word); } } }); //flatMapStream.print(); // Tuple2 指的是2元组 DataStream<Tuple2<String, Integer>> mapStream = flatMapStream.map(new MapFunction<String, Tuple2<String, Integer>>() { @Override public Tuple2<String, Integer> map(String word) throws Exception { return Tuple2.of(word, 1); // ("hello",1) } }); DataStream<Tuple2<String, Integer>> sumResult = mapStream.keyBy(new KeySelector<Tuple2<String, Integer>, String>() { @Override public String getKey(Tuple2<String, Integer> tuple2) throws Exception { return tuple2.f0; } // 此处的1 指的是元组的第二个元素,进行相加的意思 }).sum(1); sumResult.print(); // 执行 env.execute("WordCount01"); }}打开命令行输入命令查看云主机本地ip。ifconfig将得到的ip填入代码中。打包代码。右侧项目target目录下生成jar包。2.5 运行代码在命令行窗口输入命令打开监听:nc -l 9999打开flink web 上传jar包运行代码。点击左边栏Submit New Job。点击右边 Add New 。上传jar包。填写任务运行参数。填写主类:com.example.WordCount,点击Submit运行。在命令行监听输入单词。打开flink web Task Managers。点击Stdout 可以看到打印出刚刚输出的单词数量,根据相同单词数据进行累加统计。不再进行监听的时候,进入命令行,按下Ctrl+C停止命令行监听窗口。至此,本案例全部内容完成。
  • 使用鲲鹏BoostKit数学库优化程序性能
    本案例基于云开发环境演示,将以KML_VML和KML_BLAS为例,介绍鲲鹏数学库获取和编译,然后使用C语言编写demo进行性能测试查看KML优化前后的性能效果。 一、概述1. 案例介绍鲲鹏数学库(KML, Kunpeng Math Library)是基于鲲鹏平台优化的高性能数学函数库,由多个子库组成,广泛应用于科学计算、HPC等领域。 通过本案例,用户可以快速掌握鲲鹏数学库的安装与使用,并对所涉及的数学库性能表现有清晰认识。2. 案例流程 二、操作步骤1. 云开发环境准备登录华为开发者空间,点击开发平台 > 云开发环境 > 开发桌面,点击创建按钮,创建开发环境:2. 安装数学库打开Terminal,执行以下命令下载数学库软件包,本次案例使用的是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文件。 sudo cp -R ./usr/local/kml/ /usr/local/sudo cd /usr/local/kmlsudo ln -s 'find ./ -name *kspblas.so* -type f' ./libkspblas.sosudo ln -s 'find ./ -name *kvml.so* -type f' ./libkvml.sosudo ln -s 'find ./ -name *km.so* -type f' ./libkm.so 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' | sudo tee -a /etc/profileecho 'export LD_LIBRARY_PATH=/usr/local/kml/lib:$LD_LIBRARY_PATH' | sudo tee -a /etc/profileecho 'export LD_LIBRARY_PATH=/usr/local/kml/lib/kblas/nolocking:$LD_LIBRARY_PATH' | sudo tee -a /etc/profileecho 'export LD_LIBRARY_PATH=/usr/local/kml/lib/kblas/omp:$LD_LIBRARY_PATH' | sudo tee -a /etc/profileecho 'export LD_LIBRARY_PATH=/usr/local/kml/lib/kblas/pthread:$LD_LIBRARY_PATH' | sudo tee -a /etc/profileecho 'export LD_LIBRARY_PATH=/usr/local/kml/lib/kvml/multi:$LD_LIBRARY_PATH' | sudo tee -a /etc/profileecho 'export LD_LIBRARY_PATH=/usr/local/kml/lib/kvml/single:$LD_LIBRARY_PATH' | sudo tee -a /etc/profileecho 'export LD_LIBRARY_PATH=/usr/local/kml/lib/kspblas/multi:$LD_LIBRARY_PATH' | sudo tee -a /etc/profileecho 'export LD_LIBRARY_PATH=/usr/local/kml/lib/kspblas/single:$LD_LIBRARY_PATH' | sudo tee -a /etc/profile执行命令使环境生效。source /etc/profile4. 数学库性能测试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循环实现求正弦函数值,需要2712微秒,而使用KML_VML仅需要828微秒。 4.2 KML_BLAS测试BLAS(Basic Linear Algebra Subprograms)提供了一系列基本线性代数运算函数的标准接口,包括矢量线性组合、矩阵乘以矢量、矩阵乘以矩阵等功能。BLAS已被广泛的应用于工业界和科学计算,成为业界标准。KML_BLAS库提供BLAS函数的C语言接口。使用命令创建测试文件test_gemv.c文件。vi test_gemv.c进入到vim编辑器界面后,按下“i”键后,复制以下代码粘贴到编辑器中,复制完成后按下“ESC”键输入“:wq”,退出编辑器界面,该段代码主要功能是:初始化规模为1000300的矩阵A,长度为300的向量x,长度为1000的向量y1和y2,分别用计时器对按照矩阵-向量的成家规则实现算法求解,即y=alphaAx+betay,以及调用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循环实现,需要1653微秒,而使用KML_BLAS仅需要187微秒,性能提升将近8倍。  
  • [问题求助] 请问920鲲鹏模组载板,需要烧录哪些代码,如何运行,在哪下载资料学习运行使用等
    1、出现问题时,您做了哪些操作?答复:请问按照Demo原理图设计了2P的920模组的载板,如何给载板上的CPLD,bmc烧录代码,如何控制载板上电时序,让载板和两个920模组运行起来?哪里可下载相关资料学习运行及使用该载板2、在哪个步骤出现了问题?答复:目前只是做出并焊接好了2P 920模组载板,载板上的各路电源,输出电压正常(单独使能各电源,不由载板CPLD使用各电源),但不知如何烧录载板CPLD代码,不知如何运行该载板。3、您希望得到什么结果?答复:运行该2P 920载板,可满足上电时序要求,正常安装操作系统等,可正常运行等。4、您实际得到什么结果?答复:单独使能载板上的各路电源,输出电压正常,但不知如何烧录载板上的CPLD代码等,不知如何控制载板上的各路电源的上电时序,不知如何运行该载板。
  • [技术干货] 【实战案例】在开发者空间的鲲鹏云主机上获取openjdk方法汇总
    方法一:从github的AdoptOpenJDK仓获取1)下载并安装到指定目录(如/opt/tools/installed)wget  cid:link_0tar   -zxf OpenJDK8U-jdk_aarch64_linux_hotspot_8u191b12.tar.gzmv jdk8u191-b12   /opt/tools/installed/【注】:使用系统自带Openjdk软件包可以通过执行“yum -y install java-1.8.0*”进行安装然后参考如下步骤配置JAVA_HOME环境变量;2)配置java环境变量,在/etc/profile文件末尾处增加下面的代码:JAVA_HOME=/opt/tools/installed/jdk8u191-b12PATH=$JAVA_HOME/bin:$PATHexport   JAVA_HOME PATH3)运行下面命令,使修改的环境变量生效:source   /etc/profile注:github发布的openjdk系列版本链接如下cid:link_9cid:link_1cid:link_2cid:link_3cid:link_4cid:link_5cid:link_6cid:link_7cid:link_8 方法二:从清华镜像仓获取Adoptium仓下归档的openjdk二进制tar.gz包(包含openjdk 8/11/17/18/19等主流版本,会更新为最新版本)https://mirrors.tuna.tsinghua.edu.cn/Adoptium/ 下载aarch64的tar.gz包后,按“1”中方法设置JAVA_HOME环境变量即可使用;  方法三:从adoptopenjdk官网发布页面下载aarch64的tar.gz包(按“1”中方法设置JAVA_HOME环境变量即可使用)https://adoptopenjdk.net/releases.html  
  • 基于开发者空间,鲲鹏BoostKit之MongoDB安装与调优指南
    案例介绍本文主要介绍如何在云开发环境中使用鲲鹏服务器通过RPM方式部署MongoDB,并提供了调优指南。案例内容一、概述1. 案例介绍MongoDB是一个基于分布式文件存储的数据库。由C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。性能调优是一个涉及多个层面的复杂过程,从硬件和操作系统的选择到子系统的设计和算法选择,都需要仔细考虑。在调优过程中,必须遵循一定的原则以确保得到正确的结果。通过本实验,用户可以快速掌握鲲鹏服务器中MongoDB的安装与使用,并对其性能调优有清晰认识。2. 适用对象企业个人开发者高校学生3. 案例时间本案例总时长预计60分钟。4. 案例流程说明:云开发环境准备;配置安装环境;安装MongoDB;调优指南。5. 资源总览本案例预计花费0元。资源名称规格单价(元)时长(分钟)华为开发者空间云开发环境-开发桌面鲲鹏通用计算增强型 kc2 | 4vCPUs | 8G | Euler免费60二、操作步骤1. 云开发环境准备登录华为开发者空间,点击开发平台 > 云开发环境 > 开发桌面,点击创建按钮,创建开发环境:自定义开发环境名称,点击确定按钮,创建开发环境:开发环境状态由创建中变为已就绪:点击更多->开机,开发环境状态变为运行中:点击远程桌面,进入开发桌面:2. 配置安装环境停止防火墙。sudo systemctl stop firewalld.service关闭防火墙。sudo systemctl disable firewalld.service查看防火墙状态。sudo systemctl status firewalld.service创建数据目录以存储MongoDB的数据文件。执行如下命令创建数据目录。sudo mkdir /datasudo mkdir -p /data/mongo配置外网Yum源:查看Yum源,可以看到存在外网Yum源(存在后缀为.repo的文件)。ls /etc/yum.repos.d/使Yum源生效。sudo yum clean allsudo yum makecachesudo yum list配置本地Yum源:下载OS镜像文件。(备用下载地址:https://mirrors.huaweicloud.com/centos-vault/altarch/7.6.1810/isos/aarch64/CentOS-7-aarch64-Everything-1810.iso)sudo wget https://dtse-mirrors.obs.cn-north-4.myhuaweicloud.com/case/0013/CentOS-7-aarch64-Everything-1810.iso挂载OS镜像文件,编辑文件。sudo mount /home/developer/CentOS-7-aarch64-Everything-1810.iso /mntsudo vim /etc/fstab按“i”进入编辑模式,在文件末尾添加如下信息。输入完成后按“Esc”键,输入 “:wq”,按“Enter”保存并退出编辑。/home/developer/CentOS-7-aarch64-Everything-1810.iso /mnt iso9660 loop 0 0备份Yum源。cd /etc/yum.repos.dsudo mkdir baksudo mv *.repo bak配置本地Yum源。cd /etc/yum.repos.dsudo vim local.repo按“i”进入编辑模式,在文件末尾添加如下信息。输入完成后按“Esc”键,输入 “:wq”,按“Enter”保存并退出编辑。[local]name=local.repobaseurl=file:///mntenabled=1gpgcheck=0查看local.repo文件。sudo cat local.repo使Yum源生效。sudo yum clean allsudo yum makecachesudo yum list3. 安装MongoDB本文以MongoDB 4.0.12版本为例通过RPM包安装MongoDB和MongoDB Tools的操作步骤。安装依赖包。cd ~sudo yum -y install python2 python2-setuptools python2-devel net-tools切换到“/root”目录下,分别下载MongoDB和MongoDB Tools的RPM包。sudo cd /rootsudo wget https://mirrors.huaweicloud.com/kunpeng/yum/el/7/aarch64/Packages/database/mongo-4.0.12-1.el7.aarch64.rpm --no-check-certificatesudo wget https://mirrors.huaweicloud.com/kunpeng/yum/el/7/aarch64/Packages/database/mongodb-tools-4.0.6-1.aarch64.rpm --no-check-certificate安装MongoDB和MongoDB Tools的RPM包。sudo rpm -ivh mongo-4.0.12-1.el7.aarch64.rpm sudo rpm -ivh mongodb-tools-4.0.6-1.aarch64.rpm查看安装后的MongoDB和MongoDB Tools的RPM包和路径。sudo rpm -qa | grep mongo-4.0.12 sudo rpm -qa | grep mongodb-tools-4.0.6-1ll /usr/local/mongo/bin/ ll /usr/local/mongodb-tools/bin/   查看MongoDB版本。cd ~sudo find / -name mongod 2>/dev/nullsudo /usr/local/mongo/bin/mongod --version修改MongoDB的配置文件,删除并新建“/etc/mongodb.cnf”文件。sudo rm -f /etc/mongodb.cnfsudo vim /etc/mongodb.cnf按“i“进入编辑模式,添加如下内容,添加完成后按“Esc”键,输入“:wq”,按“Enter”保存并退出编辑。dbpath=/data/mongologpath=/data/mongo/mongo.loglogappend=trueport=27017fork=trueauth=falsebind_ip=0.0.0.0配置文件参数说明:dbpath代表数据文件存放目录。logpath代表日志文件存放目录。logappend=true代表日志以追加的形式添加。port代表端口号。fork=true代表以守护程序的方式启用,即在后台运行。auth=false代表连接数据库不需要验证用户名和密码。bind_ip代表可以访问的地址。127.0.0.1表示自己访问,0.0.0.0 表示所有人都能访问。启动MongoDB数据库,使用配置文件启动MongoDB数据库。sudo nohup /usr/local/mongo/bin/mongod -f /etc/mongodb.cnf &确认MongoDB数据库进程是否正常启动,可以看到数据库进程ID为2995且已正常启动。sudo ps -ef | grep mongod查看MongoDB数据库的监测端口,在本例中MongoDB数据库的监测端口为27017。sudo netstat -anpt 、登录MongoDB数据库并验证数据库是否可以正常运行。cd /usr/local/mongo/binsudo ./mongo查看当前存在的数据库,并输入“exit“退出。show dbs  验证MongoDB Tools中的命令是否正常,进入MongoDB Tools的bin目录。cd /usr/local/mongodb-tools/bin/验证MongoDB Tools命令是否正常。本文以mongorestore和mongoreplay为例进行说明。sudo ./mongorestore --versionsudo ./mongorestore --helpsudo ./mongoreplay --versionsudo ./mongoreplay --help4. 调优指南4.1 缓存参数调优编辑文件,按“i“进入编辑模式,将“vm.swappiness = 0“ 修改为“vm.swappiness = 1“,修改完成后按“Esc”键,输入“:wq”,按“Enter”保存并退出编辑。sudo vim /etc/sysctl.conf原理:vm.swappiness值越大,越积极使用交换分区;值越小,越积极使用内存,将值设置为“1”,以减少交换分区的使用。 执行如下命令使修改生效。sudo sysctl -p将dirty_ratio参数设置为“5“,表示内存里的脏数据百分比不能超过这个值。echo 5 | sudo tee /proc/sys/vm/dirty_ratio4.2 数据库参数调优通过调整数据库的配置参数,可以有效提升数据库的性能和可靠性(根据实际需求设计即可)。请参见下表修改数据库的配置文件。配置文件默认为“/etc/mongodb.cnf”,修改配置文件后需重启数据库生效。参数说明建议acheSizeGBcacheSizeGB参数控制WiredTiger引擎使用内存上限。如果一台机器只部署一个MongoDB,建议设置成内存的60%。OplogOplog用于MongoDB的复制。建议大小设置为可用disk空间的5%。commitIntevalMs控制MongoDB的journal日志刷新。建议使用默认值,值越大,性能越好,但数据丢失可能性更大。syncPeriodSecs控制flush到磁盘的时间间隔。建议使用默认值,值越大,性能越好,但影响数据库可靠性。noprealloc是否启用数据文件预分配。建议设置为true。noscripting是否启用脚本引擎。建议设置为true。notablescan是否允许表扫描。建议设置为true。4.3 客户端优化编辑文件。sudo vim /etc/sysctl.conf按“i”进入编辑模式,在末尾追加以下内容。net.ipv4.ip_local_port_range = 1024 65535net.ipv4.tcp_tw_reuse = 1net.core.somaxconn = 65535net.core.netdev_max_backlog = 8096net.ipv4.tcp_max_syn_backlog = 8192net.ipv4.tcp_keepalive_time = 600net.ipv4.tcp_fin_timeout = 30net.ipv4.tcp_max_tw_buckets = 3000 参数说明:参数说明net.ipv4.tcp_tw_reuse允许将TIME-WAIT sockets重新用于新的TCP连接 0:关闭(default)1:开启net.ipv4.ip_local_port_range用于向外连接的端口范围net.core.somaxconn定义了系统中每一个端口最大的监测队列的长度,这是个全局的参数,默认值为128net.core.netdev_max_backlog每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目net.ipv4.tcp_max_syn_backlog表示那些尚未收到客户端确认信息的连接(SYN消息)队列的长度,默认为1024,加大队列长度为262144,可以容纳更多等待连接的网络连接数net.ipv4.tcp_keepalive_time表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间,默认为2小时net.ipv4.tcp_fin_timeout表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭net.ipv4.tcp_max_tw_buckets表示系统同时保持TIME_WAIT sockets的最大数量,默认为180000追加完成后按“Esc”键,输入“:wq”,按“Enter”保存并退出编辑。执行以下使修改结果立即生效。sudo sysctl -p至此,鲲鹏BoostKit之MongoDB安装与调优全部完成。
  • [技术干货] 【实战案例】基于鲲鹏云主机构建AI小模型推理实践
    1. AI火热的大背景下,公共模型与私有模型的发展之路在人工智能快速发展的当下,公共模型与私有模型正朝着不同但又相互补充的方向发展:公共模型的发展趋势:a) 性能持续提升与架构创新:公共模型将不断追求性能的提升,通过架构创新来实现智能和成本之间的平衡。如混合专家模型(MoE)架构已被广泛应用,未来会有更多类似的架构创新,使公共模型在处理不同任务时能更高效地激活部分参数,减少计算资源的浪费,提高推理效率。b) 开源生态的繁荣与社区协作加强:开源公共模型的发展将更加迅速,像 Hugging Face 这样的平台将汇聚更多的开发者,他们会基于开源模型创建越来越多的衍生产品,推动公共模型在更多领域的应用和性能提升。社区协作也将加强,通过共享代码、交流心得,共同解决公共模型面临的问题,如安全性问题等。c) 与私有模型融合互补:公共模型不会完全替代私有模型,而是与私有模型相互融合。企业可能会在一些通用任务上使用公共模型,而在涉及敏感数据或特定业务场景时,结合私有模型进行补充,通过构建生成式 AI “协调层”,调用完成任务的最佳模型。私有模型的发展趋势:a) 数据安全与隐私保护驱动增长:对于金融、医疗、政务等对数据安全和隐私保护要求较高的行业,私有模型将得到更广泛的应用。企业和机构会倾向于将 AI 系统部署在自有服务器上,确保敏感数据在内部处理和存储,避免数据泄露风险。b) 定制化需求推动行业专用模型发展:企业为了更好地满足自身特定业务场景的需求,会越来越多地选择定制化的私有模型。通过结合自身的业务流程、数据特点等,对模型进行微调或重新训练,使私有模型在垂直领域的应用更加精准和高效,如按照品牌风格撰写广告文案、特定行业的数据分析等任务。c) 降低成本与提高效率的技术探索:虽然私有模型的初始投资较大,但企业会不断探索降低成本和提高效率的方法。例如,采用更高效的硬件架构、优化模型训练和推理算法等,同时,随着技术的发展,一些开源的模型开发工具和框架也将为私有模型的建设提供更多的便利,降低开发和维护成本。2. 基于鲲鹏云服务器构建普惠AI推理小模型私有模型发展道路上的困难:对于中小企业而言,在私有模型算力底座的搭建上正面临两难困境:若基于 GPU/NPU 卡自建,初始投入动辄数十万甚至上百万,成本门槛极高,对资金实力有限的中小企业构成沉重负担;而若转向公共模型,又因业务数据敏感(如客户信息、交易数据等),存在数据泄露风险,难以满足隐私保护需求。更突出的矛盾在于,中小企业业务场景相对简单、团队规模有限,即便勉强承担成本搭建了私有算力底座,其实际业务对算力的需求往往远低于底座的承载能力,最终导致硬件资源闲置与资金投入的双重浪费,陷入 “不用公共模型怕泄密,自建私有模型又用不起、用不完”的困境。 开源技术栈 + 华为云能力:赋能鲲鹏云服务器快速构建专属 AI-Agent通过深度集成开源技术栈与华为云核心服务能力,可助力客户基于鲲鹏云服务器,以快速、便捷的方式搭建专属 AI-Agent 解决方案,大幅缩短从方案设计到落地应用的周期。具体落地层面,方案依托鲲鹏云稳定、高效的算力支撑,深度整合Ollama deepseek-r1:7b 模型与Dify 编排推理平台两大核心组件,为 AI 应用开发者打造了一套 “开箱即用” 的一站式开发环境。开发者无需投入大量精力进行底层技术适配与平台搭建,即可直接基于该环境完成模型调用、流程编排、功能调测等全环节操作,且整体方案具备高性价比优势,有效降低开发成本。基于此环境,开发者能够轻松实现多样化知识问答类应用的全流程开发与落地,例如企业智能客服系统(自动响应客户咨询)、个性化教育助手(定制化答疑辅导)、专业领域知识库(如医疗、法律行业知识查询)等,高效满足不同场景下的 AI 应用需求。 鲲鹏 kX1 实例 + HCE OS:低成本承载 DeepSeek 7B 小模型推理基于“鲲鹏 kX1 实例 + HCE OS”架构部署 DeepSeek 7B 小模型,可实现8 tokens/s 的推理性能。尽管相较于 GPU 实例,该性能在绝对数值上存在一定差距,但从实际业务场景出发,8 tokens/s 的吞吐速度完全能够满足智能问答类场景的交互需求 —— 无论是用户日常咨询、信息查询,还是基础问答服务,均能保障流畅的响应体验。更核心的优势在于其极致的成本控制:方案起步成本仅需300 余元 / 月,大幅降低了小模型推理场景的落地门槛,为追求高性价比的客户(如中小企业、个人开发者)提供了一套兼顾性能与成本的优质解决方案,助力其以低投入快速实现 AI 能力的部署与应用。   基于鲲鹏云服务器的 7B/14B 小模型:低成本赋能 AI 实践与行业智能化依托鲲鹏云服务器构建的 7B、14B 量级小模型,凭借 “轻量化部署 + 低门槛成本” 核心优势,精准覆盖两类核心用户群体,为不同场景下的 AI 应用落地提供高效解决方案:一、赋能人工智能从业者,加速创意验证与技术实践针对提示词工程师、AI 产品经理等 AI 领域从业者,该小模型可打造轻量化推理验证环境。其核心价值在于:低成本启动:以每月百元级的起步成本,大幅降低个人技术实践门槛,无需承担高额硬件投入即可拥有稳定的模型运行环境;高效兑现创意:搭配已完成调优的模型编排工具,从业者能快速将 AI 应用构想转化为可验证的原型,高效测试功能可行性、优化交互逻辑,实现 “小成本投入,大体验落地”,助力个人技术能力提升与创意迭代。二、服务中小企业,推动行业场景智能化升级面向驾校、律所等中小企业,该小模型可结合行业需求构建专属智能系统,解决企业数字化转型中 “成本高、落地难” 的痛点。驾校场景:低成本搭建科目一、科目四智能学习系统,企业可根据学员规模灵活选择模型数量,起步投入低、资源粒度可控,既能精准匹配教学需求,又能有效控制预算,提升学员学习效率与驾校教学服务质量;律所场景:集成专业法律知识库后,可快速构建自动法务咨询系统,实现常见法律问题的智能应答,减少人工咨询压力,降低企业人力成本,同时为客户提供 7x24 小时高效响应服务,提升律所服务效率与市场竞争力。 总结人工智能的未来,绝不局限于模型本身的迭代优化,也不止于算力的单纯升级 —— 更关键的是基于模型的上层应用创新。这种创新需要成千上万的开发者与 AI 从业者共同探索,但当前高昂的入门成本,却在无形中阻碍了探索的脚步。而依托鲲鹏 CPU 算力构建的普惠 AI 推理开发平台,正为这一困境提供了破局之道:它以更低廉的成本,为开发者们提供了切实有效的实践载体,让更多人能够轻松迈入 AI 应用创新的门槛,释放创造力。 
  • 鲲鹏云专业服务主要解决用户哪些问题?
    提供“一站式”鲲鹏云化服务:包括应用移植可行性评估、移植方案设计、应用移植改造支持、性能调优服务、移植验证测试支持、业务上线支持等系列服务,同时专注鲲鹏云应用型人才培养,满足企业国产化改造各项要求,为客户业务平滑上鲲鹏云保驾护航。一站式专家服务支撑客户业务批量移植改造上云,100+HCE OS原厂开发,100+移植专家团队,40+行业场景,400+ 组件迁移实施实战经验。技术最佳实践 800+。【案例】某香港Top金融客户作业系统移植适配鲲鹏平台,支撑信创和效率提升。痛点挑战:1、系统架构复杂,涉及多个服务间的依赖,移植困难。2、应用厂商和维护人员对鲲鹏云平台使用存在盲区。解决方案:1、系统调研分析客户系统业务间逻辑和依赖,给出整体移植方案;2、重点难点问题攻关,优化程序并压测;3、客户相关人员国产化技术赋能培训,金种子培养。服务价值:1、客户作业系统100%平滑移植到鲲鹏平台;2、对标x86部分组件效率提升10%-20%;3、应用厂商和运维人员100%掌握国产化相关技术。
  • [热门活动] 【门票预约】2025华为开发者大赛暨开发者年度会议
     ​ 2025年华为开发者大赛暨开发者年度会议门票正式开启预约!诚邀您莅临开发者盛典,在最美华为研发中心-上海练秋湖(贝壳厅),大赛总决赛角逐、主论坛大咖分享、分论坛技术演讲、开发者创意展区、实操CodeLabs、优秀开发者颁奖!共同感受云上创新的无限可能,见证开发者们如何以代码为桨,驶向更远的远方!门票预约:cid:link_0想了解大会亮点、议程安排的开发者们,点击官网获取最新信息!大会官网:cid:link_1​
  • [技术干货] 【实战案例】国产算力云厂商:端到端解决方案助力自动驾驶进阶
    自动驾驶技术正快速发展,国产算力云厂商凭借其在强大算力基础、分布式架构和生态合作方面的优势,通过构建端到端的解决方案,为车企提供从模型训练、仿真测试到车云协同的全链路支持。云算力平台已成为推动自动驾驶技术迭代和商业化落地的关键力量,正助力产业从L2级辅助驾驶向更高级别的自动驾驶迈进。1 国产算力云厂商的机遇与挑战自动驾驶产业正处于从技术探索向规模化商业落地过渡的关键阶段,这为国产算力云厂商带来了重大机遇,同时也伴随着一系列挑战。市场机遇:中国自动驾驶市场增长迅速,L2级辅助驾驶已成为中高端车型的标配,并正快速向L3及以上级别迈进。云算力需求呈现指数级增长,车企为降低研发成本并加速迭代,越来越倾向于采用云服务而非自建算力平台。政策层面,“十四五”规划将算力基础设施置于战略高度,“东数西算”工程则通过全国一体化算力网络布局,为国产云厂商提供了强大的基础设施支持。技术挑战:高级别自动驾驶对算力的需求几乎是“无底洞”。训练一个端到端自动驾驶模型可能需要处理数十万小时的驾驶数据,涉及多模态特征融合、时序建模和决策优化,需要大规模GPU/NPU集群、高速存储和高带宽内存的支持。端到端(E2E)模型 虽然通过统一网络直接将传感器输入映射到车辆控制指令,整体优化车辆行为,但其决策逻辑如同一个“黑箱”,可解释性差,需要通过仿真、对抗测试和因果分析等方法来确保安全性和可靠性。竞争与合作态势:国际巨头如英伟达在自动驾驶芯片领域占据领先地位,国产芯片厂商(如黑芝麻智能、地平线)正奋力直追,并通过与云厂商合作寻求突破。车企与云厂商的合作日益深化,例如华为云与长安、广汽、奇瑞等车企的合作,共同推动智能驾驶技术的研发和落地。2 端到端智能驾驶的云算力需求端到端智能驾驶将感知、决策和控制功能整合到同一深度学习网络中,直接从传感器数据生成车辆控制指令。这种方法虽能提升系统响应速度、优化复杂场景表现并减少模块间误差积累,但其研发和落地对云算力提出了极高要求。需求维度传统模块化架构端到端(E2E)模型云算力关键作用算力规模相对较低,模块独立训练极高,需处理高分辨率图像、激光雷达点云等多模态数据,联合训练提供万卡级别NPU/GPU集群,支持大规模分布式训练数据量模块化数据采集与处理海量,需覆盖海量多样化场景(城市、乡村、高速、极端天气)提供PB级高性能存储(如128PB缓存,12TB/s带宽),高效处理原始数据迭代速度月级或周级天级甚至小时级,快速仿真和验证生成式仿真将场景构建从1周缩至5分钟,版本迭代从月级缩至周级协同效率模块间接口复杂,协同难度大端云深度协同,训练在云端,推理在车端提供“以云助车”方案,云端训练复杂模型,车端部署轻量化模型,保障实时性💡 华为云推出的 CloudMatrix384超节点计算架构(384颗昇腾NPU+192颗鲲鹏CPU高速互联)、百度汽车云3.0的百舸4.0平台(支持异构多芯训练,万卡集群有效训练时长占比99.5%以上),都是应对E2E算力挑战的典型解决方案。3 构建端到端解决方案的核心策略为抓住自动驾驶时代的机遇,国产算力云厂商需构建以下核心能力,形成独特的端到端解决方案优势:3.1 打造国产化算力底座与超强集群构建基于国产AI芯片(如昇腾NPU)的大规模算力集群是基础。这不仅关乎性能,更涉及数据安全、供应链稳定和成本可控。华为云的 CloudMatrix384超节点 是典型案例,其性能在E2E和VLA模型训练上表现优异。百度智能云的 百舸4.0 AI计算平台 支持主流异构芯片多芯训练,实现了万卡集群下有效训练时长占比99.5%以上,显著优化了算力成本。3.2 建设覆盖全国的汽车专用基础设施网络自动驾驶需要低时延、高可用的算力接入。在全国枢纽节点建设汽车专用专区,是实现全国覆盖和一致体验的关键。华为云布局了贵安、乌兰察布和芜湖三大汽车专区,形成跨南北的双专区布局,实现车云时延降低60%,系统可用性达99.999%。这种多区域多活架构确保了车辆在跨区域出行时能获得一致的智能驾驶辅助体验,并为分布式训练和数据聚合提供了基础。3.3 提供全链路工具链与开放平台从数据处理、模型训练、仿真测试到部署推理,云厂商需提供一站式工具链,降低车企研发门槛和成本。百度汽车云3.0提供了覆盖智驾开发全流程的工具链平台,支持虚拟场景生成和真实数据仿真测试,加速长尾问题解决。天翼云与优咔科技合作,整合“遨云”自动驾驶解决方案,为车企提供数据采集、模型训练、仿真验证一站式服务。3.4 推动产业生态协同与标准共建通过共建联盟、联合创新等方式,汇聚产业力量,共同推动技术发展和标准制定。华为云与长安、广汽、奇瑞等车企深度合作,联合研发和落地智能驾驶方案。百度发起 “车路云数据合作联盟” ,整合交通集团、主机厂数据,构建实时路况信息平台,提升系统感知和决策能力。4 分阶段赋能自动驾驶落地路径不同级别的自动驾驶对算力、网络和安全性要求各异,云厂商的支持策略也需随之调整。4.1 L2级(辅助驾驶)阶段:聚焦算法迭代与成本优化L2级以实现自动巡航(ACC)、车道保持(LKA)、自动泊车(AP) 等单功能或有限功能集成化为目标。云算力支持重点:大规模仿真测试和模型快速迭代。通过云端并行仿真,大幅缩短测试周期,验证算法在各种 corner case 下的表现。落地实践:华为云“以云助车”方案帮助车企将泊车成功率提升15%,并优化端到端泊车效率。百度汽车云3.0通过虚拟场景生成,加速训练数据积累和算法优化。4.2 L3级(有条件自动驾驶)阶段:强化安全合规与冗余设计L3级允许驾驶员在特定条件下脱手脱眼,系统在需要时请求接管。安全性、可靠性和可解释性成为核心要求。云算力支持重点:大规模仿真验证、可解释AI(XAI) 工具和满足功能安全(如ASIL-D) 的合规性要求。云平台需提供强大的仿真能力,覆盖海量长尾场景,并对模型的决策逻辑进行可视化分析。落地实践:华为云与长安合作研发“天枢智驾”,基于CloudMatrix384超节点进行大规模训练和仿真验证,以满足L3级系统的高安全要求。黑芝麻智能的华山A1000芯片已通过ASIL-B认证,支持L2+至L3级自动驾驶。4.3 L4/L5级(高度/完全自动驾驶)阶段:实现车云协同与全域感知L4/L5级追求在特定区域(L4)或任何场景(L5)下的完全无人驾驶。其对算力的需求达到顶峰,且需要车云实时协同。云算力支持重点: 车云一体架构:车辆端负责实时环境感知和局部决策,云端则进行全局路径规划、高精度地图实时更新和复杂计算任务处理,并通过5G等低时延网络与车端同步。 超大规模训练:处理来自车队的海量真实路采数据,进行持续学习和模型优化。 高精度仿真:构建数字孪生世界,进行亿万公里级的虚拟测试,覆盖极端罕见场景。落地实践:九识智能的L4级无人物流车在全国近300城运营,其背后的算力调配中心拥有超万核计算能力和千卡智算算力,通过“算网大脑”实现全国性智能调度和实时数据处理。华为云、百度云等也在积极布局支持L4/L5的算力基础设施和解决方案。5 未来发展趋势与展望自动驾驶和云算力的结合未来将呈现以下趋势:算力需求持续指数级增长:随着端到端模型和多模态融合(如VLA、世界模型)的演进,对算力的渴求将有增无减。云端协同成为绝对主流:“云端训练、车端推理”的模式将成为标准范式,云厂商将持续优化模型压缩和蒸馏技术,以实现高效部署。可解释性与安全性成为生命线:随着自动驾驶普及,模型的决策必须越来越透明可信。可解释AI(XAI)、仿真测试和安全验证工具将是云平台的核心竞争力。从“赋能车企”到“赋能移动生态”:云厂商提供的智能驾驶能力不仅用于汽车,还将赋能机器人、低空经济、智能制造等更广阔的智能产业。国产算力云厂商通过构建强大的端到端解决方案,正从底层赋能中国自动驾驶产业的发展。它们通过打造国产化算力底座、建设专用基础设施、提供全链路工具链和推动产业生态协同,支撑着自动驾驶技术从L2到L5的有序落地和持续演进。希望以上分析能为你提供有价值的参考。如果你对特定级别的自动驾驶落地或者某家云厂商的具体策略有更深入的兴趣,我很乐意提供进一步的信息。
  • 【实战案例】XX HPC仿真项目案例
    背景:业界算力按着类型分类包含通算、智算、超算。 云超算是云上关键负载类型,基于Hyperion-Research数据,全球云HPC算力占HPC总空间17%,5年平均增长率17.6%。 包含典型负载工业、科研、气象、能源、制药、金融、生命科学、渲染等广泛场景。芯片仿真作为其中一个细分场景,伴随国家芯片工业崛起,算力诉求持续增长,是未来云超算增长的关键机会和方向。关键挑战:芯片仿真算力成本占比较低,相比线下定制硬件如何提供足够的性能、效率,满足客户业务效率即仿真时长诉求是上云的关键。同时芯片仿真是数据敏感型业务,如何切入场景打消客户顾虑是关键挑战。场景切入选择:从芯片设计制造环节看,包含芯片设计、生产制造、测试过程。 越向前端数据敏感型越高,对应上云的意愿相对低。制造和测试环境相对数据敏感型更低,上云难度更小。 其中对于算力有强烈诉求的阶段,包含OPC、良品分析等过程。 这部分算力诉求和芯片的工艺、芯片晶体管密度直接相关,伴随国产芯片崛起,这部分算力持续增长。例如:OPC场景(光学畸变矫正仿真), 通过大量的计算仿真,弥补矫正掩膜版,最终实现设计与实际芯片预期一致。   再比如: 良品率检测,通过采集晶圆的图像信息,识别每个单元的良品情况。  容易理解,芯片复杂度、工艺水平直接决定了算力规模诉求。解决方案:1)从基础算力角度,选择高主频通用算力,结合生态兼容性可以选择X86、鲲鹏算力。 基于物理核、动态关核提升单核睿频3.6GHz+,单核内存带宽、OS性能优化、RDMA 7us低时延网络满足仿真高性能诉求。 即保障云上资源、算力统一,同时满足云上单核高性能诉求。2)头结点大内存容量诉求,可以选择M系列、E系列算力。基于400Gbps组网支持头结算任务的快速分发和收据收集,提升集群仿真训练效率。3)从调度器角度,可以选择Slum 或者多瑙等调度器,实现资源灵活。满足万核、十万核、乃至百万核集群调度和任务管理诉求。4)基于网络和LandingZone能力组合满足客户数据安全、传输安全。实现事前可控、事中可视、事后可审。5)   基于SFS Turbo,提供百万IO,20G带宽,1~2ms低时延高性能存储。  展望:面向国产化芯片仿真,需要结合公司芯片积累,繁荣国产生态。面向HPC场景加速服务化能力构筑。提供一站式服务。结合灵衢关键能力,持续提升网络吞吐、降低时延,提升大规模集群线性度。  
  • [技术干货] 鲲鹏BoostKit大数据Spark算法加速分享
    一、 命题:鲲鹏BoostKit大数据算法优化【命题内容】∶基于Spark 2.4.5和Hadoop 3.2.0版本,Spark GraphX中Betweenness介数中心性算法,用于描述图数据中每个节点在图中与其它节点的连通程度,体现了结点在图中的重要程度。介数中心性算法可以支撑的应用包括:金融行业中用于评价客户的信贷风险;互联网行业中用于评价社交网络中的用户影响力及活跃度;政府行业中用于识别疾病传播的关键人员、地点;运营商行业中用于识别潜在关键客户。服务器规格限制:一个队伍3台虚拟机,每台虚拟机的规格:华为云鲲鹏通用计算增强型Kc18核、32GB内存。系统盘:高IO 40GB;数据盘:高IO 500GB;带宽4Mbit/s。操作系统: openEuler 20.03 64bit with ARMSpark开源组件中Betweenness算法采用公开网络数据集com-Amazon(点数量33万,边数量92万,http://snap.stanford.edu/data/com-Amazon.html),算法精度为75%,计算耗时为60Os,精度低、计算效率差,无法满足实际业务需求,期望从算法技术原理、鲲鹏亲和性适配角度,优化算法的精度和效率,精度提升到90%以上,计算耗时降低到90s以下【答题要求】:1、 算法交付软件需要可以运行在Spark平台上,并提供部署运行的指导文档。2、 保持Betweenness算法的对外使用接口,与开源Spark算法一致。【提示】从鲲鹏亲和性(多核并发、数据结构优化、通信优化)和算法原理(降低算法计算复杂度)优化Spark分布式组件的Betweenness算法二、鲲鹏BoostKit大数据介绍Spark - 基本组成和概念① spark core: 实现了spark的基础功能(任务调度,内存管理。错误恢复,与存储系统交互等),以及对弹性api数据集的API定义。② spark SQL: 是spark用来操作结构化数据的程序包,支持多种数据源hive,parquet,josn等。 Spark SQL 通常用于交互式查询,但这一领域同类产品太多,更多作为MapReduce的替代者,用于批量作业。③ spark streaming: 对实时数据进行流式计算的组件,提供了用来操作数据流的API,并于spark core中的RDD API高度对应。 Spark Streaming 流式batch处理。主要同类产品为storm。④ spark MUib: 提供常见的机器学习(ML)功能的程序库。 提供了机器学习相关的统计、分类、回归等领域的多种算法实现。其一致的 API 接口大大降低了用户的学习成本。⑤ GraphX 是spark面向图像计算提供的框架和算法库, 支持分布式,Pregel 提供的 API 可以解决图计算中的常见问题。资源管理组件Cluster Manager(集群资源管理器): 是指在集群上获取资源的外部服务,目前有以下几种。Standalone : Spark原生的资源管理,由Master负责资源的管理。Hadoop Yarn : 由YARN中的ResourceManager负责资源的管理。Mesos : 由Mesos中的Mesos Master负责资源的管理。应用程序Application (应用程序)︰ 是指用户编写的Spark应用程序,包含驱动程序( Driver )和分布在集群中多个节点上运行的Executor代码,在执行过程中由一个或多个作业组成。Driver(驱动程序) : Spark中的Driver即运行上述Application的main()函数并且创建SparkContext,其中创建SparkContext的目的是为了准备Spark应用程序的运行环境。ClusterManager通信,进行资源的申请、任务的分配和监控等;当Executor部分运行完毕后,Driver负责将SparkContext关闭。通常用SparkContext代表Driver。作业执行Worker(工作节点)∶ 集群中任何可以运行Application代码的节点,类似于YARN中的NodeManager节点。在Standalone模式中指的就是通过Slave文件配置的Worker节点,在Spark on Yarn模式中指的就是NodeManager节点。Master(总控进程): Spark Standalone运行模式下的主节点,负责管理和分配集群资源来运行SparkAppliation。Executor(执行进程): Application运行在Worker节点上的一个进程,该进程负责运行Task,并负责将数据存在内存或者磁盘上,每个Application都有各自独立的一批Executor。在Spark on Yarn模式下,其进程名称为CoarseGrainedExecutorBackend,类似于Hadoop MapReduce中的YarnChild。作业(Job ) : RDD中由行动操作所生成的一个或多个调度阶段。调度阶段( Stage ): 每个作业会因为RDD之间的依赖关系拆分成多组任务集合,称为调度阶段,也叫做住务集。( TaskSet )。调度阶段的划分是由DAGScheduler来划分的调度阶段有Shuffle Map Stage和Result Stage两种。任务(Task): 具体执行任务。 分发到Executor上的工作任务,是Spark实际执行应用的最小单元。DAGScheduler : DAGScheduler是面向调度阶段的任务调度器,负责接收Spark应用提交的作业,根据RDD的依赖关系划分调度阶段,并提交调度阶段给TaskScheduler。TaskScheduler : TaskScheduler是面向任务的调度器,它接受DAGScheduler提交过来的调度阶段,然后以把任务分发到Work节点运行,由Worker节点的Executor来运行该任务。三、 鲲鹏Spark算法加速库开源Spark组件在鲲鹏平台的部署运行编译Spark组件: cid:link_3编译Hadoop组件: cid:link_2编译Zookeeper组件: 编译Zookeeper组件: cid:link_1安装部署Spark组件: cid:link_4鲲鹏的Maven仓库: cid:link_8华为云的中央仓库: cid:link_7开源Spark组件性能调优Spark平台调优cid:link_5Spark算法调优cid:link_6开源Spark组件Betweenness算法测试1、 开源Betweenness算法下载地址:源码: cid:link_02、 添加MainApp.scala主程序,执行betweenness算法,获取结果,计算精度和执行时间3、 在鲲鹏服务器上编译打包hbse_2.11-0.1.jar4、 wget http://snap.stanford.edu/data/com-Amazon.html上传到HDFShdfs put com-amazon.txt/betweenness/com-amazon.txt*开源代码工程及运行脚本会发送给参数队列3、 运行算法spark-submit \--master yarn --deploy-mode client\--name "Betweenness_opensource" \--num-executors 6 --executor-memory 14G --executor-cores 4 --driver-memory 4G\--jars "./lib/scopt_2.11-3.2.0.jar" \./lib/hbse_2.11-0.1.jar-i hdfs://betweenness/com-amazon.txt -g hdfs://betweenness/com-amazon-groundTruth.txt其中hbse_2.11-0.1.jar是开源betweenness算法软件包scopt 2.11-3.2.0.jar是依赖包,下载地址: http://www.java2s.com/example/iar/s/download-scopt211320 j ar-file.html-i是标明原始数据集在hdfs的路径﹐-g是标明数据集求解结果在hdfs的路径,用来计算精度。Betweenness算法介绍(介数中心性算法)算法原理介数中心性算法计算图中介数中心性值最大的K个结点,是网络中心性重要的度量参数之一,同时也是图计算领域的基础算法。介数中心性算法的目的是衡量图中每一个结点与其它结点之间的互动程度,经过结点的最短路径数越多,该结点的介数中心性值越大,结点在图中的重要性也就越高。结点的介数中心性值是基于图中最短路径经过该结点的次数计算,最后选取图中介数中心性值最大的K个结点,输出这K个结点的编号和介数中心性值。算法定义介数中心性的定义: 图中每个结点的介数中心性等于图中所有结点对的最短路径经过该结点的次数除以结点对之间所有最短路径总条数。每个节点v的介数中心性可通过以下公式计算:σst(v) 是从结点s到t的最短路径的数量,   σst(v) 是从结点s到t且经过结点v的最短路径数量。其中 σst(v)表示经过节点 v的s→t的最短路径条数, σst表示 s→t的最短路径条数。直观上来说,betweenness反映了节点v作为“桥梁”的重要程度。算法应用介数中心性算法可用于识别图上最重要的一批结点,可以支撑的应用包括:安平行业: 用于识别欺诈团伙中的核心成员、识别谣言传播的关键人员。金融行业: 用于评价客户的信贷风险。互联网行业: 用于评价社交网络中的用户影响力及活跃度。政府机关: 用于识别疾病传播的关键人员、地点。电信运营商: 用于识别潜在关键客户。鲲鹏BoostKit大数据:积极建设开源软件生态全面支持开源大数据支持开源Apache大数据各场景组件开源社区接纳ARM生态Hadoop、Hive、Hbase、Spark和Flink、ElasticSearch、Kudu等核心组件的开源社区支持ARM备注: Hadoop、ElasticSearch开源社区已经提供官方版本的ARM软件包鲲鹏镜像仓: cid:link_9开源数据虚拟化引擎openLooKeng , openLooKeng致力于为大数据用户提供极简的数据分析体验,让用户像使用“数据库”一样使用“大数据”。openLooKeng是一款开源的高性能数据虚拟化引擎。提供统一SQL接口,具备跨数据源/数据中心分析能力以及面向交互式、批、流等融合查询场景。同时增强了前置调度、跨源索引、动态过滤、跨源协同、水平拓展等能力。Spark组件提供原生的机器学习MLlib和图GraphX算法库,支持在分布式集群上运行。鲲鹏基于算法原理和芯片特征针对机器学习和图分析算法进行深入优化,实现相比原生算法性能提升50%。机器学习&图分析算法加速库提供以下算法优化,后续版本会持续更新增加算法。机器学习算法: 分类回归(随机森林、GBDT、SVM、逻辑回归、线性回归、决策树、PreFixSpan、KNN、XGBoost)算法、聚类(Kmeans、LDA、DBScan)算法、推荐(ALS)算法、特征工程(PCA、SVD、Pearson、Covariance、Spearman)算法图分析算法: 群体分析(极大团、弱团、Louvain、标签传播、连接组件、CC)、拓扑度量(三角形计数、Cluster Coefficient)算法、路径分析(最短路径、循环检测、广度优先搜索)、骨干分析(PageRank、亲密度、Kcore、Degree、TrustRank、PersonPageRank、Betweenness)算法、相似分类算法(子图匹配)、图表示学习类算法(Node2Vec)BoostKit图算法,加速亿级图谱分析某省级项目9000万节点,20亿边关系图谱社团发现类:基于业务场景选择实体,确定实体间的关系,从而构成具备业务属性的关系图谱。社团发现类算法能在此关系图谱上,挖掘抽象图中的关系稠密团体,为挖掘目标团伙提供数据基础。全量极大团挖掘算法:耗时1小时内,执行性能较友商提升6倍,局部稠密场景,友商是非精确求解,且无法算出结果。基于团渗透的社区发现算法:耗时1小时内,执行性能较友商提升5倍。BoostKit机器学习算法,加速十亿级样本特征分析某运营商局点,全量样本~10亿条,中标样本~10万条,模型精度由80%提升至99.9%。特征降维算法(PCA)∶提炼关键特征,降低计算复杂度,将 计算时间由5小时降低为1小时 ;聚类算法(DBSCAN)︰提取重要样本,降低专家复核成本, 从10万级样本规模降低为千级样本规模 。SVD的英文全称是Singular Value Decomposition,翻译过来是奇异值分解。这其实是一种线性代数算法,用来对矩阵进行拆分。拆分之后可以提取出关键信息,从而降低原数据的规模。因此广泛利用在各个领域当中,例如信号处理、金融领域、统计领域。在机器学习当中也有很多领域用到了这个算法,比如推荐系统、搜索引擎以及数据压缩等等。SVD算法不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。是很多机器学习算法的基石。图分析算法优化方案:分布式PageRank算法1. 内存占用优化:基于稀疏压缩的数据表示,使得算法的内存占用下降30%,有效解决大数据规模下的内存瓶颈问题2. 收敛检测优化:简化收敛检测过程,使整体任务量减少5%-10%。3. 全量迭代+残差迭代组合优化:有效降低前期数据膨胀带来的shuffle瓶颈,整体性能可提升 0.5X-2X 。通过算法计算模式的自适应切换,整体shuffle量减少50%,性能较优化前平均提升50%+
  • [技术干货] 【实战案例】银行新一代分布式核心系统性能调优案例复盘
    背景:某股份制银行新一代核心系统以客户服务为中心,支撑产品化运营,提供存、贷、汇等核心服务,并支持其他专业系统的账务、核算,记录全面、精细化的交易数据,为智能化管理、分析提供基础数据支持。新一代核心系统在进行业务分布式改造之外,还同步进行了国产化改造和云原生容器化部署。为能发挥核心应用在当前的开发框架、云化基础设施的软硬件结合最佳性能,验证老系统向全新架构规模迁移可行性,该行搭建了新一代核心业务系统技术验证平台对各类新产品和新技术进行功能和性能测试验证,调整优化软硬件基线配置,探索分布式架构下的最佳实践。  挑战:该平台主要包括分布式云原生应用、分布式数据库和缓存数据库三大部分。其中云原生应用以容器形式部署在国芯服务器上,分布式数据库部署在国芯裸金属服务器,并搭配NVME高性能硬盘,操作系统全部采用国产OS。该行核心业务是基于HCS全栈云容器服务进行的云原生改造和上云方案规划。从集成设计上面向行内CPaaS统一容器云平台,进行CCE容器集群的纳管和运维指标流对接;从技术场景上支持容器集群中各业务系统关联的namespace与各容器业务Pod子网的关联,满足云内云外、云间容器业务南北向流量安全防护的要求。为了验证新平台、新架构下的系统性能,该行开发部门选取了较为复杂的联机交易场景,系统架构和业务流程如下:微服务化架构:网关、存款服务、内部账服务、统一序列号、分布式事务等各服务,均以微服务架构运行在CCE容器集群中;服务注册发现:各类微服务会定期维持到服务注册中心的心跳,同时定期拉取微服务清单和配置信息,实现配置更新及服务发现;压测流程设计:业务请求从压力机或终端进入,首先会通过网关服务,调用存款服务的接口,存款服务根据业务类型,依次调用周边统一序号、SEATA、内部账等服务,并结合业务逻辑,进行多次的数据库操作。业务流量从压力机到应用侧,然后到数据库层,最终完成后返回结果。                        图一:某股份制行新一代核心业务系统架构 对比于传统架构,云原生化的分布式业务系统在进行微服务改造、容器化部署之后,整体架构更为复杂,各类服务间大量使用RPC远程调用通信,具有网络请求高频,时效性要求严,数据强一致性要求高的特点。其中网络上的高频请求带来的时延累计开销,对于SDN云网在云原生网络扁平化和高速直通方面提出更高要求,同时其对数据强一致性的要求也为分布式数据库带来了挑战。 分析与对策:展开分析这些挑战之后,我们针对该行新一代分布式新核心系统,分阶段先后针对分布式系统架构、分布式数据库、和业务端到端性能优化,进行了专项调优。 一、      分布式系统架构调优该行全栈云所采用的软SDN Overlay网络中,负责VXLAN隧道解封装的隧道端点VTEP,广泛分布在算力资源节点、软SDN网元节点、集中式裸金属网关节点、增强型裸金属交换机或者硬专线交换机上,且虚拟机和裸金属节点分属不同的接入交换机,导致各节点间互访的流量路径较为复杂。考虑到分布式架构下的高频RPC访问场景,为追求最佳性能,我们建议该行针对分布式架构单独设计网络部署模型,收敛虚拟机应用、容器化业务、分布式数据库的VPC网络模型,基于IaaS和容器的扁平化网络、三层专线BL发挥交换机的硬件转发能力、以及分布式数据库基于HCS裸金属高速网络加速东西向流量等优化措施,大幅度提升了云平台对于分布式业务的性能支撑水平。 二、      分布式数据库调优从传统集中式数据库迁移至分布式数据库挑战巨大,既要充分发挥分布式数据库海量数据高并发的优势,也要避免架构由集中式转变为分布式带来的影响,为此在数据库层面采用了下列优化措施,1.    减少自增列的使用,规避分布式数据库自增属性列的写入效率不及集中式数据库的不足;2.    批量优化:对数据表以账号进行了哈希水平分片,并且在每个分片内也以账号字段哈希分区,通过多分片多分区并行执行的方式,发挥分布式数据库并行性能优势;3.    内存/磁盘管理策略优化:定时策略清理服务器buff/cache,高并发读写时,规避因服务器缓存释放不及时造成TPS和时延的不稳定;4.    条带化:数据库NVME盘由LVM进行管理,对于分布式数据库DN节点这种I/O密集型服务,尽可能降低读写延迟。 三、      业务应用端到端性能调优通过业务单笔交易的全链路时延分析,经过上述优化之后的交易时延开销,主要来自于分布式应用和微服务框架、RPC调用和数据库事务处理,根据这些瓶颈点,在应用层,继续在缓存优化、批量优化和通讯优化三方面进行进一步优化,1.    缓存优化:对于高频访问且相对静态的参数类库表,采用Redis缓存来优化数据访问效率;对于SQL预编译的结果进行缓存,规避应用侧SQL预编译的时间开销;对于注册中心提供本地服务列表内存缓存、本地服务列表文件缓存的多级缓存策略,提升高可用能力和访问效率。2.    批量优化:在资源允许的范围内进一步提高任务处理的并发度,将批量任务化整为零,通过进行合理的任务分片全面提升批处理的效率,同时通过减小单个事务的规模,尽量避免大事务的产生。3.    底层通讯优化:微服务高频交互的场景下,将服务间的通讯协议由HTTP协议优化为基于Socket长连接的bolt协议,提升通讯效率。  处理结果:经过跨经三个多月的三轮调优及压测,在相同配置基线下,基于鲲鹏服务器的华为HCS云原生平台在业务平均响应时延、TPS等关键指标明显优于基于X86国产化服务器的其他云平台。调优组织涉及参与方众多,包括银行业务部门、云平台提供商、数据库提供商、国产操作系统提供商、硬件提供商等;调优涉及的业务应用层次复杂,包含多个层面多维度关联调优:业务层->技术平台层->数据库->操作系统层->云平台软件层->基础设施硬件层等。通过这次核心业务性能调优的实战,我们证明了我司是真正具备全面软硬技术栈以及多软件技术栈专家资源和技术储备的厂商,在核心业务全要素上云和调优场景中,能够成为客户的左膀右臂,加速其核心业务系统基于华为云Stack全栈云平台上云的速度与决心。 经验和教训:针对银行新一代核心业务的性能调优,是一个系统性的工作;并且基于全面云原生容器化的分布式改造在金融行业也是一个具有开创引领特征的行业架构创新,先验经验不多,各个层级的综合挑战繁多,需要从下面三个方面进行规划和持续完善:1-    组织层面,无论是对于客户自身,还是云厂商而言,因为云化核心业务的调优,要求复杂场景下的调优方案,对于不同领域专家协同作战能力有很高诉求,双方都需要配套组织级的综合作战能力。2-    工具层面,核心业务调优面对的是业务端到端全链路场景下的问题识别和优化,对于业务层面的交易链路发现和检测、综合业务拓扑、云内网络和数据中心物理网络的统一视图,在工具配套上有非常迫切要求,以避免出现问题黑盒,对于调优本身和未来的投产运维保障带来风险。3-    服务层面,项目驱动的方式,面对行业级的趋势和诉求,在支撑范围和容量上存在短板,需要从可规模复制的维度上,定向沉淀和构建金融关键业务调优的专业服务能力。 
  • 【实战案例】XX大数据项目案例
    背景:互联网核心业务基于流量搜推广,实现广告变现。 搜推业务的数据源来自大数据系统。因此互联网云服务化核心算力诉求集中在搜推广、大数据、门户与视频、AI。 其中大数据业务伴随客户量、数据量线性增长。典型业务架构如下: 关键挑战:客户大数据业务上云目前规模有限,典型客户将数据放在线下,弹性分析负载放在线上,呈现存算分离形态。如何提供满足客户业务高性价比大数据算力,成为互联网大数据上云的关键点。解决方案: 鲲鹏算力相比X86算力有几个明显优势:1) 鲲鹏物理核,无HT之间的争抢,L1/L2Cache容量更大。相比X86在高负载条件下性能更加平稳,单核主频相比X86略低,对于IO密集大数据性能无明显劣势 2) 单核内存带宽。 鲲鹏整机160核,相比X86算力,内存通道相同整机内存带宽相当。单核内存带宽相比X86内存大带宽高1倍。3) 采用擎天架构,整机网络带宽一致,相比X86算力,单核网络带宽高1倍4) 鲲鹏物理核相比X86矢量单元多1倍,基于矢量优化可以进一步提升整体性能。 5) 鲲鹏应用使能套件BoostKit 大数据场景OmniRuntime全栈加速库 加速方案加速效果OmniRuntime算子加速Native SQL引擎加速OmniRuntime参数调优调优精准度提升OmniHBaseGSI二级索引优化非rowkey建立索引表,提升效率OmniShuffle 加速内存预提数据交换,小iO聚合业务效果:基于TPC-DS Q29重载业务领先X86算力性能28%。规格CPU内存磁盘Q29性能打分km2.32xlarge.81281024G10 * 1T ESSD100ac8.32xlarge.81281024G10 * 1T ESSD78经验总结:云上大数据数据处理计算部分可以采用鲲鹏算力,实现性价比提升。 特别是面向重载业务场景,即单核带宽敏感、内存带宽敏感的大数据业务场景收益更明显。与此同时,大数据业务场景HCE OS\毕昇编译器\Omni 大数据加速库全栈加速库,实现指令效率大幅提升。释放鲲鹏算力优势。展望:鲲鹏算力在工艺受限条件下,单核计算性能面向X86竞争压力较大,对于非计算敏感的大数据业务,存在场景化优化的可能性。鲲鹏采用物理核与X86超线程核竞争,相比超线程核单核性能更加平稳,单核访存带宽、网络存储带宽更优。这部分差异化优势是鲲鹏大数据算力的核心差异化优势的来源。重载大数据业务条件细分场景,需要进一步识别。鲲鹏物理核硬件单元,包含加解密、压缩单元,矢量单元。 从单元数量和能力都领先X86,需要结合大数据向量化,压缩卸载等进行优化,充分释放鲲鹏硬件单元优势。实现性能超越。     
  • [技术干货] 【实战案例】某广告业务性能调优最佳实践
    背景:25年需要完成某服务鲲鹏切换,鲲鹏资源规模上量,使鲲鹏成为终端云高性能、高可靠、高安全的第二算力选择。基于该背景,华为云联合A云广告业务,深入关键业务场景,持续进行全栈性能调优,整体业务性能优于C7,成为鲲鹏调优的一个标杆案例。本次会议对A云广告业务鲲鹏切换及调优过程进行复盘交流, 识别调优过程改进点,帮助完善调优总结,形成最佳实践,能力外溢其他项目,达成600+服务鲲鹏切换、百万核规模上量的目标。挑战:如何在客户牵引鲲鹏过程中建立信心,确保性能不劣于x86,能够保证业务稳定可靠,是首要解决的问题。面对时延敏感型应用,如何在主频劣于x86的情况下,保证时延不下降,对性能调优后团队带来巨大挑战。同时,调优过程中存在的现网业务和基础用例之间的负载特征不一致,会导致客户现网部署遇到性能瓶颈。分析与对策:系统分析客户特定应用场景的典型负载,梳理鲲鹏全栈解决方案,包括:加速库、OS、调优参数、编译优化等。通过多轮迭代优化,匹配最佳调优方案,并通过软硬协同实现鲲鹏芯片算力的能力全释放。服务KC2调优前P99时延(ms)特征服务:P99.9 时延KC2调优后P99 时延(ms)特征服务:P99.9时延C7P99 时延(ms)特征服务:P99.9时延调优项调优效果约束限制召回635253替换Glibc+Kqmalloc库降低1ms 反馈编译优化降低3ms依赖业务侧流水线改造OS 切换HCE2.0 降低4ms 代码大页优化降低2ms依赖镜像默认配置改造毕昇编译优化降低1ms依赖业务侧流水线改造检索25.5220.120.28OS切换HCE2.0降低3ms 内核参数优化:cluster-aware降低0.4ms 毕昇编译优化降低1ms依赖业务侧流水线改造反馈编译优化降低 1ms依赖业务侧流水线改造特征服务251421代码大页优化降低1ms依赖镜像默认配置改造OS切换HCE2.0降低4ms OS 内核参数优化:cluster-aware降低1ms Nuwa平台调度48u->32u,实现不跨numa降低 5ms MEP532737OS切换HCE2.0降低4ms 代码大页优化降低 2ms依赖镜像默认配置改造OS 内核参数优化:cluster-aware降低1ms 毕昇JDK替换降低2ms依赖业务侧流水线改造Nuwa平台调度48u->32u,实现不跨numa降低 9ms MEP模型TVM转换重编译降低 8ms适配arm向量指令集处理结果:在关键时延敏感型业务,广告业务的调优过程中,耗时2月+,实现4个业务模块的调优,从劣于x86 30%+调优到基本持平,个别子场景,优于x86 15%的效果。总结: 展望:随着智能时代的到来,软件定义硬件正逐渐取代硬件定义软件的主流形态。如何借助软件能力、算法优势、编译器配合,充分释放硬件性能,是鲲鹏竞争力提升的第二曲线。需要以业务应用为突破口,在战略引导下,深入洞察,赋能硬件和下一代芯片演进,这具有重要意义。    
  • [技术干货] 【实战案例】Z项目鲲鹏转码案例总结
    基于全新一代鲲鹏算力支持Z转码业务降本增效项目背景伴随直播、点播等业务快速兴起,所有互联网门户基本提供了相似能力。从本质看,基于流量广告变现的模式决定了互联网入口的业务形态。头厂商算力规模XX万到XXX万核水平,高性价比视频转码成为视频转码刚性诉求。业务部署架构以离线转码为例,通过转码服务器将主播原始视频在转码服务器进行格式和帧率转码,满足终端客户不同诉求,通过CDN进行分发。 对于实时性要求不高的场景,互联网厂商基于CPU软编算法实现码率、画质、带宽之间的平衡,同时满足客户业务弹性关键诉求。  基于鲲鹏CPU转码方案与关键优势1.  鲲鹏采用物理核高负载性能更加平稳 鲲鹏物理核独占计算单元、指令流水线,性能平稳无争抢、切换。从现网实际表现看,整机负载80%以上条件下,性能平稳,无掉帧等现象。与此同时物理核配套访存cache单元、访存带宽明显优于X86算力,倍增。最新一代鲲鹏CPU主频2.9GHz,性能问题,无降频。X86超线程核,内部通用计算单元、Cache,在高负载条件下存在性能降低或者波动 2. SVE矢量单元数量相比X86高1倍,性能更优 面向视频转码场景,本身是对帧内、帧间压缩。存在大量像素并行处理,基于CPU 矢量单元(单指令多数据)并行处理是业界性能加速的典型范式。由于鲲鹏采用物理核形式售卖,物理核单价相比X86超线程核更低。从矢量单元数量角度,每个鲲鹏物理核包含2个SVE矢量单元,每个X86超线程核1个AVX矢量单元。由于512位矢量运算降频问题,大量业务在128或者256位宽的矢量单元进行运算,因此在矢量运算部分,鲲鹏相比X86可以提升1倍性能。 3. H264/H265加速库+毕昇编译加速,释放鲲鹏算力优势,领先友商10%以上 总结:基于鲲鹏物理核优势,从矢量单元规模、高负载算力平稳性、场景化加速能力,鲲鹏在转码场景相比X86、友商ARM性能更优,同时鲲鹏目录价相比X86更优,是互联网头部厂商转码算力降本增效利器。