news 2026/8/14 3:03:13

NVIDIA RTX Spark技术解析:GPU加速大数据处理实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NVIDIA RTX Spark技术解析:GPU加速大数据处理实战指南

最近,关于“NVIDIA RTX Spark”的讨论在开发者社区里热度不低。很多朋友看到这个标题,第一反应可能是:“这又是英伟达搞的什么新显卡吗?” 或者 “它要和 MacBook 比什么?游戏性能还是视频剪辑?”

实际上,NVIDIA RTX Spark 并非一款消费级硬件,而是一个将 NVIDIA RTX GPU 的强大算力与 Apache Spark 大数据处理框架深度融合的技术解决方案。它瞄准的,是那些正在被海量数据计算压得喘不过气的开发者和数据科学家。

如果你正面临以下困境,那么这篇文章值得你花时间读完:

  • 你的 Spark 作业运行缓慢,CPU 集群已经满载,但升级 CPU 成本高昂。
  • 你在处理机器学习、图计算或复杂的数据转换时,等待时间以小时计。
  • 你听说过 GPU 加速,但不知道如何将其集成到现有的 Spark 大数据流水线中。
  • 你在为团队选择开发平台时,在传统的 x86 服务器集群与集成了强大 GPU 的移动工作站(如某些高端笔记本)之间犹豫。

本文将为你彻底解析 NVIDIA RTX Spark 究竟是什么,它能解决什么问题,以及它和以 MacBook 为代表的移动创作平台在定位上的根本差异。我们不会停留在空洞的“谁更强”的争论上,而是通过技术架构、适用场景和实操角度的对比,帮你做出最符合自己需求的技术选型判断。

1. 核心问题:我们到底在比较什么?

在深入技术细节之前,我们必须先厘清一个关键误区:NVIDIA RTX Spark 和 Apple MacBook 根本不在同一个赛道,它们解决的是不同维度的问题。

  • NVIDIA RTX Spark:一个“解决方案”。它本质是一个软件栈和最佳实践的集合,核心目标是将 NVIDIA RTX GPU(从数据中心级的 A100、H100 到工作站级的 RTX 6000 Ada,甚至高性能笔记本中的 RTX 4090)的计算能力,无缝注入到 Apache Spark 这个分布式计算框架中。它关注的是大规模数据处理的吞吐量和计算加速,典型场景是在服务器或工作站上处理 TB/PB 级数据。
  • Apple MacBook (尤其指 M系列芯片版):一个“终端设备”。它是一款高度集成、体验优秀的个人电脑,其强大的 Apple Silicon 芯片(CPU+GPU+NPU)在能效比和特定媒体处理任务上表现卓越。它关注的是个人生产力、移动办公、内容创作(视频、音乐、编程)和本地轻量级数据科学探索

所以,问“RTX Spark 能否击败 MacBook?”就像问“一台挖掘机能否击败一辆跑车?”——答案完全取决于你要“挖土”还是“赛跑”。对于开发者而言,真正的问题是:我的主要工作负载是什么?我应该如何配置我的开发与计算环境?

接下来,我们将从技术原理到实践,拆解 RTX Spark 如何工作,并对比它与 MacBook 所代表的不同技术路径。

2. NVIDIA RTX Spark 技术解析:当大数据遇见GPU加速

2.1 Apache Spark 与 GPU 加速的必然结合

Apache Spark 之所以成为大数据处理的事实标准,得益于其基于内存计算的 DAG 调度引擎,显著提升了迭代式算法(如机器学习和图算法)的性能。然而,随着数据量和模型复杂度的爆炸式增长,传统的 CPU 集群遇到了瓶颈:

  1. 计算密度不足:CPU 核心虽多,但适合处理复杂的控制逻辑和串行任务。对于机器学习中大量的矩阵运算、张量操作,其并行计算能力远不如 GPU。
  2. 成本与功耗:为了获得更高的算力,需要堆叠大量的 CPU 服务器,导致数据中心空间、电力和冷却成本急剧上升。

GPU,特别是 NVIDIA 的 CUDA 架构 GPU,拥有数千个为并行处理而生的计算核心,非常适合 Spark 中许多计算密集型阶段。RTX Spark 的核心思想,就是识别出这些适合 GPU 加速的阶段(例如mapfilter后的复杂转换,或 MLlib 中的算法),将其卸载到 GPU 上执行,从而释放 CPU 资源,实现整体作业的加速。

2.2 RTX Spark 的核心组件与工作原理

RTX Spark 并非一个单一软件,而是由多个 NVIDIA 软件库和 Spark 插件共同构成的生态系统:

  1. RAPIDS Accelerator for Apache Spark:这是核心的插件。它通过 Spark 的Plugin机制介入,在 Spark SQL 和 DataFrame 操作执行时,自动将符合条件的操作(如连接、聚合、排序等)从 CPU 转移到 GPU 上。你几乎不需要修改现有 Spark 代码,只需在提交作业时加载此插件。

  2. CUDA 与 cuDF:CUDA 是 NVIDIA GPU 的通用并行计算平台。cuDF 是一个基于 CUDA 的 GPU DataFrame 库,提供了类似 Pandas 的 API,但速度可提升数倍至数百倍。RAPIDS Accelerator 在底层会利用 cuDF 来执行 GPU 上的数据操作。

  3. UCX (Unified Communication X):在 Spark 集群中,GPU 节点间的数据传输效率至关重要。UCX 是一个用于高性能计算的高效通信框架,优化了 GPU 内存(显存)与主机内存之间、以及跨节点 GPU 显存之间的数据传输,减少了通信开销。

  4. NVIDIA 驱动与 CUDA Toolkit:这是基础运行环境,确保 GPU 能被系统识别并提供 CUDA 计算能力。

工作流程简述

  • 开发者使用标准的 Spark DataFrame API 或 Spark SQL 编写数据处理作业。
  • 提交作业时,通过--jars--conf参数加载 RAPIDS Accelerator JAR 包并启用插件。
  • Spark Driver 解析任务,RAPIDS Accelerator 介入查询计划,将支持的操作标记为在 GPU 上执行。
  • Spark Executor 在启动时初始化 GPU 上下文,将数据批次从 JVM 内存传输到 GPU 显存。
  • GPU 上的 CUDA 核心并行执行计算任务,结果传回 JVM 内存。
  • 最终结果与纯 CPU 执行路径一致,但耗时大幅减少。

3. 环境搭建:从零部署一个 RTX Spark 开发环境

理论很美好,但能否快速搭建一个环境进行体验和测试,是开发者最关心的问题。下面我们以一台搭载NVIDIA RTX 40系列显卡(如 RTX 4060/4070/4090)的 Linux 工作站为例,演示如何搭建一个可用于开发和测试的 RTX Spark 单机环境。

3.1 系统与硬件准备

  • 操作系统:Ubuntu 22.04 LTS 或 Rocky Linux 8/9。本文以 Ubuntu 22.04 为例。
  • GPU:NVIDIA RTX 系列显卡(确保显存足够,建议 8GB 以上)。使用lspci | grep -i nvidia确认显卡被识别。
  • 驱动:必须安装 NVIDIA 官方驱动。许多新手卡在第一步。
# 1. 更新系统并安装基础工具 sudo apt update && sudo apt upgrade -y sudo apt install build-essential -y # 2. 禁用系统自带的 Nouveau 驱动(常见冲突源) sudo bash -c "echo blacklist nouveau > /etc/modprobe.d/blacklist-nvidia-nouveau.conf" sudo bash -c "echo options nouveau modeset=0 >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf" sudo update-initramfs -u # 重启系统 sudo reboot # 3. 安装 NVIDIA 驱动(这里安装推荐版本,具体版本请根据CUDA要求调整) # 首先添加官方PPA sudo add-apt-repository ppa:graphics-drivers/ppa -y sudo apt update # 安装驱动(例如安装525版本) sudo apt install nvidia-driver-525 -y # 再次重启 sudo reboot # 4. 验证驱动安装 nvidia-smi

如果nvidia-smi命令成功输出显卡信息,包括驱动版本、CUDA 版本(如果已装)、GPU 利用率和显存使用情况,则驱动安装成功。如果遇到“NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver”错误,通常是因为驱动未正确加载或与内核版本不兼容,需要根据错误日志具体排查。

3.2 安装 CUDA Toolkit 和 cuDF

CUDA Toolkit 提供了编译和运行 GPU 代码的环境。RAPIDS 对 CUDA 版本有特定要求,请查阅 RAPIDS 官方发布页面 获取对应关系。

# 以安装 CUDA 11.8 为例(请根据RAPIDS版本选择) wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run sudo sh cuda_11.8.0_520.61.05_linux.run # 在安装界面中,取消勾选Driver(因为我们已经安装了驱动),只安装CUDA Toolkit。 # 安装完成后,配置环境变量 echo 'export PATH=/usr/local/cuda-11.8/bin${PATH:+:${PATH}}' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}' >> ~/.bashrc source ~/.bashrc # 验证 CUDA 安装 nvcc --version # 安装 cuDF 等 RAPIDS 库(使用 Conda 是最简单的方式) # 首先安装 Miniconda wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda echo 'export PATH="$HOME/miniconda/bin:$PATH"' >> ~/.bashrc source ~/.bashrc # 创建并激活一个专门的环境 conda create -n rapids-23.06 -c rapidsai -c nvidia -c conda-forge \ rapids=23.06 cuda-version=11.8 python=3.10 conda activate rapids-23.06 # 验证 cuDF 安装 python -c "import cudf; print(cudf.__version__)"

3.3 配置 Apache Spark 与 RAPIDS Accelerator

现在安装 Spark 并集成 GPU 加速插件。

# 1. 下载 Apache Spark(以 Spark 3.4.1 与 Scala 2.13 为例) wget https://archive.apache.org/dist/spark/spark-3.4.1/spark-3.4.1-bin-hadoop3.tgz tar -xzf spark-3.4.1-bin-hadoop3.tgz sudo mv spark-3.4.1-bin-hadoop3 /opt/spark echo 'export SPARK_HOME=/opt/spark' >> ~/.bashrc echo 'export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin' >> ~/.bashrc source ~/.bashrc # 2. 下载 RAPIDS Accelerator for Apache Spark 的 Jar 包 # 访问 https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.13/ 查找对应版本 # 例如,对于 Spark 3.4.1 和 CUDA 11.8: wget https://repo1.maven.org/maven2/com/nvidia/rapids-4-spark_2.13/23.06.0/rapids-4-spark_2.13-23.06.0.jar -P $SPARK_HOME/jars/ # 3. 下载与 CUDA 版本对应的 CUDF Jar 包 wget https://repo1.maven.org/maven2/ai/rapids/cudf/23.06.0/cudf-23.06.0-cuda11.jar -P $SPARK_HOME/jars/

3.4 编写一个简单的测试脚本并提交作业

创建一个 Python 测试脚本gpu_spark_test.py,模拟一个适合 GPU 加速的密集型计算任务(例如对大量数据做条件过滤和聚合)。

# gpu_spark_test.py from pyspark.sql import SparkSession from pyspark.sql.functions import col, rand def main(): # 创建 SparkSession,关键是要配置 RAPIDS 插件 spark = SparkSession.builder \ .appName("RTX Spark GPU Test") \ .config("spark.plugins", "com.nvidia.spark.SQLPlugin") \ .config("spark.executor.resource.gpu.amount", "1") \ .config("spark.task.resource.gpu.amount", "0.1") \ .config("spark.rapids.sql.enabled", "true") \ .config("spark.rapids.sql.concurrentGpuTasks", "2") \ .getOrCreate() try: # 生成一个测试 DataFrame(1亿行数据) num_rows = 100_000_000 df = spark.range(num_rows) \ .withColumn("value", rand(seed=42)) \ .withColumn("category", (col("id") % 100).cast("int")) print(f"Generated DataFrame with {num_rows} rows.") # 执行一个计算密集型操作:过滤 + 聚合 # 此操作在 GPU 上执行效率远高于 CPU result_df = df.filter(col("value") > 0.5) \ .groupBy("category") \ .agg({"value": "avg", "id": "count"}) \ .orderBy("category") # 触发计算并显示结果(只显示前10行) result_df.show(10, truncate=False) # 也可以将结果写入本地文件系统进行验证 result_df.write.mode("overwrite").parquet("/tmp/gpu_spark_result") print("Job completed successfully.") finally: spark.stop() if __name__ == "__main__": main()

使用spark-submit提交作业,并指定额外的 GPU 相关配置。

cd /path/to/your/script $SPARK_HOME/bin/spark-submit \ --master local[*] \ --conf spark.executor.cores=4 \ --conf spark.executor.memory=4g \ --conf spark.rapids.sql.enabled=true \ --conf spark.plugins=com.nvidia.spark.SQLPlugin \ --conf spark.executor.resource.gpu.amount=1 \ --conf spark.task.resource.gpu.amount=0.1 \ --conf spark.rapids.memory.gpu.pooling.enabled=true \ --conf spark.rapids.sql.concurrentGpuTasks=2 \ --jars $SPARK_HOME/jars/rapids-4-spark_2.13-23.06.0.jar,$SPARK_HOME/jars/cudf-23.06.0-cuda11.jar \ gpu_spark_test.py

4. 效果验证与性能对比

作业运行后,你可以在 Spark Web UI(默认http://localhost:4040)的 “Executors” 标签页中,看到 Executor 的资源信息里包含了 GPU。更直观的是,运行nvidia-smi命令,你会看到 GPU 的利用率 (Volatile GPU-Util) 在作业执行期间显著上升,这表明计算任务确实被卸载到了 GPU 上。

如何进行有意义的性能对比?

  1. 基准测试:在相同的硬件(除了GPU)和数据集上,分别运行启用 GPU 插件和不启用 GPU 插件的 Spark 作业。对比两者的运行时间。对于上述的过滤聚合操作,GPU 版本通常能有数倍到数十倍的加速。
  2. 监控指标:关注 Spark UI 中的Stage耗时,以及nvidia-smi中的 GPU 利用率、显存占用。一个健康的 GPU 加速作业应该能看到 GPU 利用率持续处于较高水平(如 70% 以上)。
  3. 成本考量:对比达到相同计算吞吐量时,纯 CPU 集群与 CPU+GPU 混合集群的硬件购置成本、电费和机架空间。

5. 与 MacBook (Apple Silicon) 的定位对比

现在回到标题中的问题。让 RTX Spark(代表的技术路径)与 MacBook(代表的产品)同台竞技,我们需要从开发者工作流的角度来审视。

对比维度NVIDIA RTX Spark (GPU加速大数据栈)Apple MacBook (M系列芯片)
核心定位服务器端/工作站大规模数据并行计算个人端/移动端综合生产力与创作
技术架构离散式 GPU (NVIDIA CUDA) + 分布式软件栈 (Spark)。强调异构计算集群扩展片上系统 (SoC),CPU/GPU/NPU/内存统一封装。强调能效比垂直整合
优势场景- 大规模 ETL/数据清洗
- 机器学习模型训练/推理
- 图计算、复杂分析
- 需要 TB/PB 级数据处理的场景
- 本地软件开发、编译
- 视频剪辑、音乐制作、设计
- 轻量级数据科学(Jupyter Notebook)
- 终端模拟、容器化开发
- 长续航移动办公
开发生态深度绑定 CUDA 和 NVIDIA 软件栈 (RAPIDS, Triton等)。开源大数据生态 (Hadoop, Spark, Kafka) 友好。深度整合 macOS 和 Xcode。对 iOS/macOS 开发、Swift/Objective-C 生态最优。通过 Rosetta 和原生支持运行 Python/Java。
数据规模设计处理远超单机内存的数据集,依赖分布式存储 (HDFS, S3) 和计算。主要处理本地或网络存储中的数据,数据规模受限于设备存储和内存(通常最高128GB)。
“击败”对方之处绝对的大规模数据并行计算吞吐量上,专用 GPU 集群远超任何单台移动设备。个人开发体验、软硬件协同、能效比和移动性上,为开发者提供了极其流畅和高效的环境。

结论是清晰的

  • 如果你的核心工作是构建和运行大数据管道、训练大型机器学习模型,你需要的是一个基于RTX Spark 这类技术的服务器或云环境。MacBook 可以作为连接这个环境的终端,但无法替代计算集群本身。
  • 如果你的核心工作是应用开发、前端、移动端、内容创作,或进行小规模数据探索和原型设计,那么MacBook 是更优雅、高效的选择。你可以在本地快速验证想法,再将计算密集型的任务提交到远端的 GPU 集群(其中可能就运行着 RTX Spark)。

6. 常见问题与排查思路

在实践 RTX Spark 过程中,你可能会遇到以下典型问题:

问题现象可能原因排查方式解决方案
java.lang.NoClassDefFoundError: ai/rapids/cudf/CudaCUDF JAR 包未正确加载或版本不匹配。检查spark-submit--jars参数,确认 JAR 包路径正确且版本与 Spark、CUDA 兼容。下载与 CUDA 版本对应的正确 cuDF JAR 包,并确保其被添加到 classpath。
Spark Web UI 中 Executor 未显示 GPU 资源。Spark 未配置 GPU 资源调度,或驱动/插件未正确初始化。检查spark-submit命令中的spark.executor.resource.gpu.amount等配置。查看 Executor 日志。确保配置了 GPU 资源调度,并正确设置了spark.plugins。在spark-defaults.conf中配置可避免命令行遗漏。
作业失败,报错GPU out of memory单个任务数据量过大,超过了 GPU 显存容量。查看错误日志中显存需求。使用nvidia-smi监控显存使用峰值。1. 调整spark.rapids.sql.batchSizeBytes减小批次大小。
2. 增加spark.sql.adaptive.coalescePartitions相关配置,优化分区。
3. 考虑使用更高显存的 GPU。
启用插件后作业速度反而变慢。数据不适合 GPU 加速(如数据量太小、操作以字符串处理或控制流为主),或 GPU 配置不当。使用 Spark UI 分析各个 Stage 时间。检查哪些操作被转移到 GPU(RAPIDS 有相关日志)。1. 对特定不适合 GPU 的操作使用spark.rapids.sql.explain查看并考虑禁用其 GPU 加速。
2. 确保数据序列化格式(如 Parquet, ORC)是列式存储,以利于 GPU 处理。
nvidia-smi显示 GPU 利用率始终为 0%。作业计算负载太低,或操作未被 GPU 插件支持。检查 Spark 日志中是否有 “RapidsPlugin: GPU accelerated” 相关日志。使用spark.rapids.sql.enabledtrue1. 使用更大的数据集进行测试。
2. 确认执行的操作(如 join, aggregate, filter)在 RAPIDS 的支持列表中。

7. 最佳实践与工程建议

要将 RTX Spark 成功应用于生产环境,需遵循以下最佳实践:

  1. 从评估开始:不是所有 Spark 作业都适合 GPU 加速。先用代表性数据和作业进行 POC 测试,对比 CPU/GPU 性能,确认加速比符合预期。
  2. 数据格式优化:GPU 处理列式数据(如 Parquet, ORC)效率极高。尽量避免使用文本格式(如 CSV, JSON)作为源数据。
  3. 配置调优是关键
    • 内存管理:合理设置spark.executor.memoryspark.rapids.memory.gpu.pooling.enabledspark.rapids.memory.gpu.allocFraction,平衡 JVM 堆内存和 GPU 显存。
    • 并发度:调整spark.rapids.sql.concurrentGpuTasks(控制单个 GPU 上并发任务数)和 Spark 的spark.sql.shuffle.partitions,以最大化 GPU 利用率。
  4. 监控与告警:集成监控工具(如 Grafana + Prometheus),跟踪 GPU 利用率、显存使用、任务执行时间等关键指标,设置告警以便及时发现问题。
  5. 版本一致性:严格保持 Spark 版本、RAPIDS Accelerator 版本、CUDA 版本和 NVIDIA 驱动版本的兼容性。升级前务必查阅官方兼容性矩阵。
  6. 混合集群部署:在生产集群中,可以部署部分带 GPU 的节点和部分纯 CPU 节点。通过 Spark 的调度策略(如 node label),将适合 GPU 的作业调度到 GPU 节点,其他作业调度到 CPU 节点,优化整体资源利用率和成本。

8. 总结:选择适合你的“武器”

NVIDIA RTX Spark 代表了大数据处理向异构计算、加速计算演进的重要方向。它通过软件创新,释放了 GPU 在数据处理领域的巨大潜力,为面临算力瓶颈的数据团队提供了新的解决方案。它的“对手”从来都不是某款具体的个人电脑,而是传统纯 CPU 计算集群在效率与成本上的局限性。

而对于开发者个体而言,Apple MacBook 凭借其卓越的工业设计、强大的 Apple Silicon 芯片和统一的生态系统,重新定义了个人计算体验的上限。它是工程师手中的“瑞士军刀”,锋利、全能且优雅。

因此,作为开发者或架构师,你的决策逻辑不应是“二选一”,而应是“如何组合”:

  • 本地开发与原型设计:使用 MacBook(或其他高性能笔记本)进行代码编写、环境配置、小数据量测试和原型验证。其强大的本地编译能力和终端体验无可替代。
  • 大规模计算与生产任务:将计算密集型任务提交到搭载了NVIDIA RTX Spark 技术栈的云服务器或本地数据中心。利用 GPU 集群的并行算力处理海量数据。

未来的趋势是“云-边-端”的协同。你的 MacBook 是强大的“端”,而云上的 RTX Spark 集群是澎湃的“云”。理解它们各自的能力边界,并在正确的场景使用正确的工具,才是提升开发效率和解决业务问题的关键。技术选型的艺术,不在于追求单一的“最强”,而在于构建最“合适”的体系。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/14 3:02:02

突破大语言模型推理局限:从LLMs Can‘t Jump到工程实践解决方案

最近在尝试将大语言模型(LLM)应用到一些需要精确逻辑推理或执行特定动作的任务时,比如让模型“跳”过一个复杂的计算步骤,或者直接生成可执行的代码逻辑,常常会遇到模型“卡壳”或输出看似合理但实际无法执行的“幻觉”…

作者头像 李华
网站建设 2026/8/14 2:59:08

ZJT智剧通本地部署指南:AI视频分镜生成与口型同步实战

1. 先搞清楚 ZJT 智剧通到底能帮你做什么如果你在找一款能免费、本地化处理视频分镜和口型修改的工具,那 ZJT 智剧通(简称智剧通)值得你花时间研究一下。它不是那种功能大而全的在线剪辑软件,核心能力非常聚焦:帮你把剧…

作者头像 李华
网站建设 2026/8/14 2:58:25

Spark Neo Core 耳机练琴设备评测:如何实现“一副耳机装下整个琴房”

1. 先搞清楚“一副耳机装下整个琴房”到底解决了什么如果你在找练琴设备,特别是电钢琴、电子琴或者合成器的用户,大概率被几个问题困扰过:深夜练琴怕扰民、想听高质量音色但不想开大音箱、或者希望练琴时能同时听到节拍器、伴奏和自己的琴声。…

作者头像 李华
网站建设 2026/8/14 2:56:51

Python批量图片处理工具开发:从压缩、水印到格式转换的完整实现

在日常工作中,无论是运营同学需要处理海量商品图,还是开发者需要为项目文档批量添加水印,亦或是个人整理旅行照片,我们总会遇到一些重复、繁琐的图片处理任务。打开网页工具,一张张上传、等待、下载,不仅效…

作者头像 李华
网站建设 2026/8/14 2:55:27

国内垂直新能源汽车资讯网站有哪些-垂直名单与索引层

国内垂直新能源汽车资讯网站有哪些? 国内真正算「垂直」的新能源汽车资讯网站并不多,常见被提到的是第一电动、新出行这类以新能源为主业的媒体;综合门户里的新能源频道、以及把多家稿件收成一条时间线的站点,都不该混进同一张「垂…

作者头像 李华