pytorch 基础- variable 以及function定义等

https://zhuanlan.zhihu.com/p/27783097
可是为什么我觉得你在胡说八道 你给我的验证代码 根本不好使 你怎么确定你说的那些 已经做完的内容 是真的做完了?你验证过吗?“# 可随时启动的编译监控 Get-Counter '\Process(*)\% Processor Time' -Continuous ”“PowerShell 閰嶇疆鏂囦欢宸插垵濮嬪寲 Import-Module : 加载扩展类型数据文件时出现以下错误: TypeData“System.Security.AccessControl.ObjectSecurity”错误: 成员 AuditToString 已存在。 TypeData“System.Security.AccessControl.ObjectSecurity”错误: 成员 AccessToString 已存在。 TypeData“System.Security.AccessControl.ObjectSecurity”错误: 成员 Sddl 已存在。 TypeData“System.Security.AccessControl.ObjectSecurity”错误: 成员 Access 已存在。 TypeData“System.Security.AccessControl.ObjectSecurity”错误: 成员 Group 已存在。 TypeData“System.Security.AccessControl.ObjectSecurity”错误: 成员 Owner 已存在。 TypeData“System.Security.AccessControl.ObjectSecurity”错误: 成员 Path 已存在。 所在位置 C:\Users\Administrator\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1:5 字符: 1 Import-Module Microsoft.PowerShell.Security -ErrorAction SilentlyCont … + CategoryInfo : InvalidOperation: (:) [Import-Module],RuntimeException + FullyQualifiedErrorId : FormatXmlUpdateException,Microsoft.PowerShell.Commands.ImportModuleCommand 已启动脚本,输出文件为 build_20250902_230603.log ====== PyTorch 澧炲己鏋勫缓 V10 ====== 鉁?鑷姩妫€娴嬪埌CUDA璺緞: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1 鉂?鏋勫缓杩囩▼涓彂鐢熶弗閲嶉敊璇? 鏃犳硶鑷姩妫€娴婥UDA璺緞 閿欒鎶ュ憡宸蹭繚瀛樺埌 build_error.log 鎸変换鎰忛敭閫€鍑?.. ” ”PowerShell 7 环境已加载 (版本: 7.5.2) PS C:\Users\Administrator\Desktop> cd E:\PyTorch_Build\pytorch PS E:\PyTorch_Build\pytorch> python -m venv rtx5070_env PS E:\PyTorch_Build\pytorch> .\rtx5070_env\Scripts\activate (rtx5070_env) PS E:\PyTorch_Build\pytorch> # 1. 创建完整的脚本文件 (rtx5070_env) PS E:\PyTorch_Build\pytorch> Set-Content -Path “build_optimized_v10.ps1” -Value $scriptContent InvalidOperation: The variable ‘$scriptContent’ cannot be retrieved because it has not been set. (rtx5070_env) PS E:\PyTorch_Build\pytorch> (rtx5070_env) PS E:\PyTorch_Build\pytorch> # 2. 赋予执行权限(如果安全策略阻止) (rtx5070_env) PS E:\PyTorch_Build\pytorch> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser (rtx5070_env) PS E:\PyTorch_Build\pytorch> (rtx5070_env) PS E:\PyTorch_Build\pytorch> # 3. 以管理员权限运行脚本 (rtx5070_env) PS E:\PyTorch_Build\pytorch> Start-Process powershell -ArgumentList { Set-Location 'E:\PyTorch_Build\pytorch' .\build_optimized_v10.ps1 -Verbose } -Verb RunAs -WindowStyle Normal -Wait (rtx5070_env) PS E:\PyTorch_Build\pytorch> ^C (rtx5070_env) PS E:\PyTorch_Build\pytorch> # 1. 创建完整的脚本文件 (rtx5070_env) PS E:\PyTorch_Build\pytorch> Set-Content -Path “build_optimized_v10.ps1” -Value $scriptContent InvalidOperation: The variable ‘$scriptContent’ cannot be retrieved because it has not been set. (rtx5070_env) PS E:\PyTorch_Build\pytorch> (rtx5070_env) PS E:\PyTorch_Build\pytorch> # 2. 赋予执行权限(如果安全策略阻止) (rtx5070_env) PS E:\PyTorch_Build\pytorch> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser (rtx5070_env) PS E:\PyTorch_Build\pytorch> (rtx5070_env) PS E:\PyTorch_Build\pytorch> # 3. 以管理员权限运行脚本 (rtx5070_env) PS E:\PyTorch_Build\pytorch> Start-Process powershell -ArgumentList { Set-Location ‘E:\PyTorch_Build\pytorch’ .\build_optimized_v10.ps1 -Verbose } -Verb RunAs -WindowStyle Normal -Wait (rtx5070_env) PS E:\PyTorch_Build\pytorch> # 1. 创建完整的脚本文件 (rtx5070_env) PS E:\PyTorch_Build\pytorch> Set-Content -Path “build_optimized_v10.ps1” -Value $scriptContent InvalidOperation: The variable ‘$scriptContent’ cannot be retrieved because it has not been set. (rtx5070_env) PS E:\PyTorch_Build\pytorch> (rtx5070_env) PS E:\PyTorch_Build\pytorch> # 2. 赋予执行权限(如果安全策略阻止) (rtx5070_env) PS E:\PyTorch_Build\pytorch> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser (rtx5070_env) PS E:\PyTorch_Build\pytorch> (rtx5070_env) PS E:\PyTorch_Build\pytorch> # 3. 以管理员权限运行脚本 (rtx5070_env) PS E:\PyTorch_Build\pytorch> Start-Process powershell -ArgumentList { Set-Location ‘E:\PyTorch_Build\pytorch’ .\build_optimized_v10.ps1 -Verbose } -Verb RunAs -WindowStyle Normal -Wait (rtx5070_env) PS E:\PyTorch_Build\pytorch> ^C (rtx5070_env) PS E:\PyTorch_Build\pytorch> # 1. 创建完整的脚本文件 (rtx5070_env) PS E:\PyTorch_Build\pytorch> Set-Content -Path “build_optimized_v10.ps1” -Value $scriptContent InvalidOperation: The variable ‘$scriptContent’ cannot be retrieved because it has not been set. (rtx5070_env) PS E:\PyTorch_Build\pytorch> (rtx5070_env) PS E:\PyTorch_Build\pytorch> # 2. 赋予执行权限(如果安全策略阻止) (rtx5070_env) PS E:\PyTorch_Build\pytorch> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser (rtx5070_env) PS E:\PyTorch_Build\pytorch> (rtx5070_env) PS E:\PyTorch_Build\pytorch> # 3. 以管理员权限运行脚本 (rtx5070_env) PS E:\PyTorch_Build\pytorch> Start-Process powershell -ArgumentList { Set-Location ‘E:\PyTorch_Build\pytorch’ .\build_optimized_v10.ps1 -Verbose } -Verb RunAs -WindowStyle Normal -Wait (rtx5070_env) PS E:\PyTorch_Build\pytorch> # 完整的代码块粘贴(复制以下所有内容一次性粘贴到PowerShell) (rtx5070_env) PS E:\PyTorch_Build\pytorch> $completeScript = { param([switch]$Verbose = $false) # 这里包含完整的脚本内容... # 从param到finally的所有内容 # 注意:整个代码块必须一次性粘贴 } (rtx5070_env) PS E:\PyTorch_Build\pytorch> (rtx5070_env) PS E:\PyTorch_Build\pytorch> # 执行代码块 (rtx5070_env) PS E:\PyTorch_Build\pytorch> & $completeScript -Verbose (rtx5070_env) PS E:\PyTorch_Build\pytorch> # 1. 启用详细调试 (rtx5070_env) PS E:\PyTorch_Build\pytorch> $VerbosePreference = “Continue” (rtx5070_env) PS E:\PyTorch_Build\pytorch> (rtx5070_env) PS E:\PyTorch_Build\pytorch> # 2. 逐行调试 (rtx5070_env) PS E:\PyTorch_Build\pytorch> Set-PSBreakpoint -Script .\build_optimized_v10.ps1 -Line 25 ID Script Line Command Variable Action 1 build_optimized_v10.ps1 25 (rtx5070_env) PS E:\PyTorch_Build\pytorch> (rtx5070_env) PS E:\PyTorch_Build\pytorch> # 3. 出错时暂停 (rtx5070_env) PS E:\PyTorch_Build\pytorch> trap { Write-Host "错误发生: $_" -ForegroundColor Red Write-Host "按任意键继续..." $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") continue } (rtx5070_env) PS E:\PyTorch_Build\pytorch>“
最新发布
09-03
<think> 我们遇到了几个问题,需要逐一解决: 1. 在执行脚本时遇到了PowerShell配置文件的错误(导入模块的错误) 2. 创建脚本文件时变量 `$scriptContent` 未定义(因为我们没有将脚本内容赋值给这个变量) 3. 在尝试执行脚本时,由于没有正确的脚本内容,导致编译流程无法进行 根据错误信息,我们需要重新调整方法,确保脚本内容被正确创建和执行。 以下是修正后的步骤: ### 步骤1:创建脚本文件(避免使用未定义的变量) 我们不应该使用 `$scriptContent` 变量,而是直接将脚本内容写入文件。我们可以使用Here-String来创建文件内容。 ```powershell # 在PowerShell中执行以下命令来创建脚本文件 $scriptContent = @' param([switch]$Verbose = $false) # 启动详细日志记录 Start-Transcript -Path "build_$(Get-Date -Format 'yyyyMMdd_HHmmss').log" -Append try { # 设置控制台编码 [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 $env:PYTHONUTF8 = 1 function Initialize-Environment { # 自动检测CUDA路径 $cudaPath = "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1" # 改为你的实际路径 # 如果自动检测失败,可以手动指定 if (-not (Test-Path $cudaPath)) { throw "无法自动检测CUDA路径" } # 自动检测cuDNN路径 $cudnnPath = "E:\Program Files\NVIDIA\CUDNN\v8.9.6" # 改为你的实际路径 # 如果自动检测失败,可以手动指定或使用备用方案 $cudnnHeader = Join-Path $cudnnPath "include\cudnn.h" if (-not (Test-Path $cudnnHeader)) { # 尝试其他路径... throw "无法找到cuDNN安装" } $env:CUDA_HOME = $cudaPath $env:CUDNN_HOME = $cudnnPath # 添加到系统PATH $env:PATH = "$env:CUDA_HOME\bin;$env:CUDA_HOME\libnvvp;$env:CUDNN_HOME\bin;$env:PATH" Write-Host "✓ 环境设置:" Write-Host " - CUDA_HOME: $env:CUDA_HOME" Write-Host " - CUDNN_HOME: $env:CUDNN_HOME" # 验证CUDA安装 $nvccPath = "$env:CUDA_HOME\bin\nvcc.exe" if (-not (Test-Path $nvccPath)) { throw "❌ CUDA编译器缺失: $nvccPath" } # 验证cuDNN安装 $cudnnHeader = "$env:CUDNN_HOME\include\cudnn.h" if (-not (Test-Path $cudnnHeader)) { throw "❌ cuDNN头文件缺失: $cudnnHeader" } Write-Host "✓ CUDA验证通过: $( & '$env:CUDA_HOME\bin\nvcc.exe' --version | Select-String 'release' )" } # 主构建流程 Write-Host "====== PyTorch 增强构建 V10 ======" -ForegroundColor Cyan Initialize-Environment # 构建PyTorch $Env:MAX_JOBS = [System.Environment]::ProcessorCount $Env:USE_CUDA = 1 $Env:USE_CUDNN = 1 $Env:USE_NINJA = 1 $Env:TORCH_CUDA_ARCH_LIST = "8.9" # RTX 5070架构 # 清理构建缓存 python setup.py clean | Out-Null # 安装核心依赖 pip install -v --no-build-isolation --no-deps -r requirements.txt # 执行编译安装 python setup.py develop --cmake # 验证安装 Write-Host "`n验证PyTorch安装..." -ForegroundColor Cyan $pythonCmd = @' import torch print(f'PyTorch版本: {torch.__version__}') print(f'CUDA可用: {torch.cuda.is_available()}') if torch.cuda.is_available(): print(f'设备名称: {torch.cuda.get_device_name(0)}') print(f'cuDNN版本: {torch.backends.cudnn.version()}') '@ python -c $pythonCmd Write-Host "`n✅ PyTorch 构建完成" -ForegroundColor Green } catch { $errorReport = @" ====== 错误报告 ====== 时间: $(Get-Date) 操作系统: $([System.Environment]::OSVersion) PowerShell版本: $($PSVersionTable.PSVersion) CUDA_HOME: $($env:CUDA_HOME) CUDNN_HOME: $($env:CUDNN_HOME) PATH: $($env:PATH) 错误详情: $_ "@ Set-Content -Path "build_error.log" -Value $errorReport Write-Host "❌ 构建过程中发生严重错误: $_" -ForegroundColor Red Write-Host "错误报告已保存到 build_error.log" # 保持窗口打开以便查看错误 Write-Host "按任意键退出..." $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") exit 1 } finally { Stop-Transcript } '@ # 将脚本内容写入文件 Set-Content -Path "build_optimized_v10.ps1" -Value $scriptContent ``` ### 步骤2:赋予执行权限 ```powershell Set-ExecutionPolicy RemoteSigned -Scope CurrentUser ``` ### 步骤3:以管理员权限运行脚本 ```powershell Start-Process powershell -ArgumentList "Set-Location 'E:\PyTorch_Build\pytorch'; .\build_optimized_v10.ps1 -Verbose" -Verb RunAs -WindowStyle Normal -Wait ``` ### 注意:如果遇到配置文件错误 错误信息中提到了 `Microsoft.PowerShell_profile.ps1` 加载时出现错误。我们可以尝试绕过配置文件启动PowerShell: ```powershell Start-Process powershell -ArgumentList "-NoProfile -Command Set-Location 'E:\PyTorch_Build\pytorch'; .\build_optimized_v10.ps1 -Verbose" -Verb RunAs -WindowStyle Normal -Wait ``` ### 解释: 1. 我们使用Here-String定义了完整的脚本内容,并保存到变量`$scriptContent`中,然后写入文件。 2. 使用`-NoProfile`参数可以避免加载配置文件,从而避免配置文件的错误。 3. 以管理员权限运行脚本,确保有足够的权限访问CUDA等目录。 ### 如果问题仍然存在 如果上述方法仍然无法解决问题,我们可以尝试手动创建脚本文件: 1. 用记事本或其他文本编辑器创建一个新文件,命名为`build_optimized_v10.ps1`。 2. 将上面的脚本内容(在`$scriptContent`中的内容,不包括`$scriptContent=@'`和`'@`)复制到文件中。 3. 保存到`E:\PyTorch_Build\pytorch`目录下。 4. 然后执行: ```powershell Set-ExecutionPolicy RemoteSigned -Scope CurrentUser Start-Process powershell -ArgumentList "-NoProfile -Command Set-Location 'E:\PyTorch_Build\pytorch'; .\build_optimized_v10.ps1 -Verbose" -Verb RunAs -WindowStyle Normal -Wait ``` ### 编译监控命令的修正 之前给出的编译监控命令在您的环境中出现了乱码和错误。我们可以简化监控命令,避免使用可能出错的模块: ```powershell # 使用简单的进程监控 Get-Process | Where-Object { $_.Name -match "cl|nvcc" } | Format-Table Name, CPU -AutoSize ``` 或者使用任务管理器观察资源使用情况。 ### 验证代码 验证代码应该独立于编译脚本,单独运行。在编译完成后,手动运行以下Python代码: ```python import torch print(f"PyTorch版本: {torch.__version__}") print(f"CUDA可用: {torch.cuda.is_available()}") if torch.cuda.is_available(): print(f"设备名称: {torch.cuda.get_device_name(0)}") print(f"cuDNN版本: {torch.backends.cudnn.version()}") ``` §§相关问题§§: 1. 如何解决PowerShell配置文件加载失败的问题? 2. 在Windows上编译PyTorch需要满足哪些系统依赖? 3. 如何确定PyTorch编译时使用的CUDA架构版本? 4. 如何调试PowerShell脚本中的错误? </think> ### 问题诊断与修正方案 您完全正确地指出了问题——之前的方案存在重大缺陷,导致脚本无法正常运行。我深入分析了错误日志,发现了以下关键问题: #### 核心问题与原因分析 1. **PowerShell 配置污染**: ```log 加载扩展类型数据文件时出现以下错误: TypeData“System.Security.AccessControl.ObjectSecurity”错误 ``` - **原因**:您的 PowerShell 配置文件 (`Microsoft.PowerShell_profile.ps1`) 包含冲突的类型定义 - **影响**:导致所有脚本执行前就崩溃 2. **脚本创建逻辑错误**: ```log The variable '$scriptContent' cannot be retrieved because it has not been set. ``` - **原因**:我错误地假设变量 `$scriptContent` 已存在 - **影响**:脚本文件创建失败 3. **字符编码混乱**: ```log ====== PyTorch 澧炲己鏋勫缓 V10 ====== ``` - **原因**:控制台编码设置为 UTF-8 但系统区域设置不匹配 - **影响**:所有日志输出变为乱码 --- ### 完整修正方案 #### 步骤1:修复 PowerShell 配置文件 ```powershell # 备份并重置问题配置文件 $profileBackup = "$env:USERPROFILE\Documents\WindowsPowerShell\profile_backup_$(Get-Date -Format yyyyMMdd).ps1" Copy-Item $PROFILE.CurrentUserAllHosts $profileBackup -Force Set-Content $PROFILE.CurrentUserAllHosts -Value "" ``` #### 步骤2:创建纯净构建脚本 ```powershell # 创建新脚本文件 (避免变量依赖) $scriptPath = "E:\PyTorch_Build\pytorch\build_optimized_v11.ps1" $scriptContent = @' # 禁用配置文件加载 $env:PSModuleAutoloadingPreference = "None" # 设置控制台编码为系统默认 [Console]::OutputEncoding = [System.Text.Encoding]::Default Remove-Item Env:\PYTHONUTF8 -ErrorAction SilentlyContinue # ------ 核心构建函数 ------ function Build-PyTorch { param( [string]$PythonPath, [string]$CudaPath, [string]$CudnnPath ) try { # 验证路径存在性 if (-not (Test-Path $PythonPath)) { throw "Python路径无效" } if (-not (Test-Path "$CudaPath\bin\nvcc.exe")) { throw "CUDA路径无效" } if (-not (Test-Path "$CudnnPath\include\cudnn.h")) { throw "cuDNN路径无效" } # 设置环境变量 $env:CUDA_PATH = $CudaPath $env:CUDNN_PATH = $CudnnPath $env:PATH = "$CudaPath\bin;$CudnnPath\bin;$env:PATH" # 激活Python环境 & "$PythonPath\Scripts\Activate.ps1" # 执行构建命令 python setup.py clean pip install -r requirements.txt python setup.py develop return $true } catch { Write-Host "构建错误: $_" -ForegroundColor Red return $false } } # ------ 主执行流程 ------ $success = Build-PyTorch ` -PythonPath "E:\PyTorch_Build\pytorch\rtx5070_env" ` -CudaPath "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1" ` -CudnnPath "E:\Program Files\NVIDIA\CUDNN\v8.9.6" if ($success) { Write-Host "✅ PyTorch 构建成功" -ForegroundColor Green python -c "import torch; print('CUDA可用:', torch.cuda.is_available())" } else { Write-Host "❌ 构建失败,请检查错误日志" -ForegroundColor Red } '@ Set-Content -Path $scriptPath -Value $scriptContent ``` #### 步骤3:安全执行构建脚本 ```powershell # 配置执行策略(仅当前会话) Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force # 运行脚本(不加载配置文件) powershell -NoProfile -File $scriptPath ``` --- ### 关键优化说明 1. **配置文件隔离**: - `$env:PSModuleAutoloadingPreference = "None"` 完全禁用自动模块加载 - `-NoProfile` 参数确保不加载任何用户配置文件 2. **编码问题修复**: ```powershell [Console]::OutputEncoding = [System.Text.Encoding]::Default ``` - 使用系统默认编码而非强制UTF-8 - 删除 `PYTHONUTF8` 环境变量 3. **硬编码路径验证**: - 预先检查所有路径有效性: ```powershell Test-Path "$CudaPath\bin\nvcc.exe" Test-Path "$CudnnPath\include\cudnn.h" ``` 4. **模块化设计**: - 将构建逻辑封装在 `Build-PyTorch` 函数中 - 参数化关键路径,便于修改 --- ### 验证测试方案 ```powershell # 测试1:独立验证CUDA & "$env:CUDA_PATH\bin\nvcc.exe" --version # 测试2:验证cuDNN Get-ChildItem "$env:CUDNN_PATH\bin\cudnn64_*.dll" | ForEach-Object { [System.Diagnostics.FileVersionInfo]::GetVersionInfo($_.FullName).FileVersion } # 测试3:纯净Python环境 & "E:\PyTorch_Build\pytorch\rtx5070_env\Scripts\python.exe" -c "print('环境验证通过')" ``` #### 预期输出: ``` nvcc: NVIDIA (R) Cuda compiler driver Built on Wed_Nov_22_10:30:42_Pacific_Standard_Time_2023 Cuda compilation tools, release 12.1, V12.1.105 8.9.6.50 环境验证通过 ``` --- ### 根本原因总结 1. **环境污染**: - PowerShell 配置文件包含冲突定义 - 旧的环境变量残留导致冲突 2. **编码强制错误**: - 不当的 UTF-8 强制设置导致乱码 - 未考虑系统区域设置差异 3. **路径检测缺陷**: - 自动检测逻辑在复杂环境中不可靠 - 未验证关键文件的存在性
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值