spark使用总结--row_number使用和partial求多个字段均值

本文介绍Spark中的高级用法,包括使用窗口函数选取分组后特定条件的第一条数据,及利用functools.partial简化多个字段的均值计算并重命名,适用于大数据分析场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目中用到spark做简单的分析,总结下一些比较经典的用法。

一、窗口函数取分组后的第一条数据
第一条数据,可以是某个值最小最大等等,使用row_number和Window函数来实现。下面实列是获取每个班级里数学成绩最低的记录。其中,F.row_number().over(Window.partitionBy(“class”).orderBy(“math”))可以直接跟列名类似,在df的select中使用。

from pyspark.sql import functions as F

    select_cols = ["class"]
    cols = ["math"]
    select_cols.extend(cols)
    select_cols.append(F.row_number().over(Window.partitionBy("class").orderBy("math")).alias("rownum"))
    res_df = df.select(select_cols).filter("rownum == 1").select(select_cols[:-1])

二、partial实现对多个字段求均值且重命名

实现对dataframe求均值且重命名操作一般为:

res_df = df.groupby("g1").agg(
		F.avg("name1").alias("name1"),
		F.avg("name2").alias("name2"),
		F.avg("name3").alias("name3"),
		...) 

这样操作,字段少的话直接写还可以接受,但是字段较多这样写就比较麻烦了,比如最近项目中的需要求均值的字段多达20个。
可以用functools.partial,输入列名数组和重命名数组,使用循环的方式来实现。

2.1 partial 简单说明
函数在执行时,要带上所有必要的参数进行调用。但是,有时参数可以在函数被调用之前提前获知。这种情况下,一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用。
以下实例,重定义了函数add10,来设置默认的第一个参数为10。

import functools

def add(a, b, c):
    return a + b + c
if __name__ == "__main__":
    add10 = functools.partial(add, 10)
    print(add10(20, 30))

2.2 如何使用partial来实现
例如:对一个dataframe有字段:

字段含义
class班级
name姓名
math数学成绩
physics物理成绩
chemistry化学成绩
import functools
from pyspark.sql import functions as F

#对变量求均值  
select_cols = ["class"]
cols = ["math", "physics", "chemistry"]
select_cols.extend(cols)
select_df = df.select(select_cols)
gp_agg = functools.partial(select_df.groupby("class").agg)
for item in cols :
    gp_agg = functools.partial(gp_agg, F.avg(item).alias(item))
res_df = gp_agg()
<think>好的,现在我要处理用户关于vLLM服务的几个参数的询问。用户之前问过关于流水线并行参数的设置,现在又问了四个新参数:max-model-len、max-num-batched-tokens、max-num-partial-prefillsmax-num-seqs。我需要逐一分析每个参数的含义使用方法,并给出配置建议。 首先,用户可能是在部署大型语言模型时遇到了性能或资源管理的问题,需要调整这些参数来优化推理速度资源利用率。我需要确保每个参数的解释清晰,并且给出实际的使用示例,帮助用户理解如何配置。 对于max-model-len,这个参数设置模型的最大上下文长度。如果用户不指定,vLLM会从模型配置中自动获取,但有时可能需要手动调整,尤其是在处理长文本时。需要注意的是,设置过大会增加显存占用,可能导致OOM错误,所以需要根据GPU显存情况调整。 接下来是max-num-batched-tokens,这个参数控制每轮迭代中批处理的最大token数。调高这个值可以提高吞吐量,但同样会增加显存使用。用户需要平衡吞吐量显存限制,尤其是在处理大量并发请时。 第三个参数是max-num-partial-prefills,用于分块预填充时的并发数。默认值是1,增加这个值可以提升处理长上下文的效率,但也会增加内存计算资源的消耗。需要根据实际场景硬件资源来决定是否调整。 最后是max-num-seqs,这个参数限制每次迭代处理的序列数。如果用户的应用中有大量并发请,适当调高这个值可以提高并发处理能力,但同样需要考虑显存计算资源的限制。如果设置过高,可能导致延迟增加或资源争用。 在给出配置建议时,需要结合不同硬件配置模型规模,比如使用A100V100时的不同推荐值。此外,需要提醒用户注意事项,如显存监控、参数间的相互影响,以及如何通过实验找到最佳配置。 最后,总结部分要简明扼要,强调根据实际需调整参数,并监控资源使用情况。确保用户能够根据提供的示例原则进行实际操作,避免常见错误。</think>以下是vLLM服务参数的详细解析及配置指南: --- ### 1. `--max-model-len` 上下文长度控制 **含义** - 设定模型处理的最大上下文长度(单位:token) - 若不指定,vLLM会自动从模型配置读取(如LLAMA-2默认4096) - **直接影响**:输入+输出的总token数上限 **使用场景** ```bash # 强制设置上下文长度为8k(需模型支持) python -m vllm.entrypoints.api_server \ --model meta-llama/Llama-2-7b-chat-hf \ --max-model-len 8192 ``` **配置原则** - 显存需公式:`显存 ≈ 模型参数量 * 2 * max_model_len * 1.2` - 示例:7B模型在A100-40G上建议≤16k,4090-24G建议≤8k --- ### 2. `--max-num-batched-tokens` 批量tokens限制 **含义** - 单次迭代处理的批处理总token上限 - **吞吐量关键参数**:值越大吞吐越高,但显存压力越大 **典型配置** ```bash # A100-80G配置示例(平衡吞吐与显存) --max-num-batched-tokens 32768 ``` **优化建议** | GPU类型 | 推荐值范围 | |------------|-------------| | A100-80G | 24k-48k | | V100-32G | 12k-24k | | RTX4090 | 8k-16k | --- ### 3. `--max-num-partial-prefills` 分块预填充 **含义** - 控制分块预填充(chunked prefill)的并发请- 默认值1:顺序处理长上下文请 - 增大该值可提升长文本处理效率 **配置示例** ```bash # 允许同时处理4个长上下文分块 --max-num-partial-prefills 4 ``` **适用场景** - 需同时处理多个长文档问答时 - 输入文本长度超过单次处理能力时 --- ### 4. `--max-num-seqs` 序列并发数 **含义** - 单次迭代处理的最大请- **并发能力核心参数**:直接影响QPS(每秒查询数) **配置策略** ```bash # 适用于高并发聊天场景 --max-num-seqs 256 ``` **黄金比例公式** `max_num_seqs ≈ GPU显存(GB) / (模型参数量(B) * 0.5) ` 示例:7B模型在24G显存:`24/(7*0.5)≈6.85 → 建议6-8` --- ### 5. **参数联动配置表** | 硬件配置 | 推荐参数组合 | |------------------|--------------------------------------------| | 单卡A100-80G | `--max-model-len 16384 --max-num-batched-tokens 32768 --max-num-seqs 64` | | 双卡V100-32G | `--max-model-len 8192 --max-num-batched-tokens 16384 --max-num-seqs 32` | | 多卡推理集群 | 组合使用`--tensor-parallel-size`与上述参数 | --- ### 6. **监控与调优** 1. 使用`nvidia-smi`监控显存占用率 2. 观察vLLM日志中的`throughput`指标 3. 逐步调整参数的实验顺序建议: ``` 调整顺序:max-model-len → max-num-seqs → max-num-batched-tokens ``` --- ### 7. **注意事项** ⚠️ **显存爆炸点**:当出现`CUDA out of memory`时,应按以下顺序降低参数: `max-model-len → max-num-seqs → max-num-batched-tokens` ⚠️ **长上下文优化**:当处理超长文本时,建议配合使用: ```bash --max-num-partial-prefills 4 --block-size 16 ``` 通过合理配置这些参数,可在不同硬件条件下实现吞吐量与延迟的最佳平衡。建议先使用默认值运行,再根据监控数据逐步调优。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值