Skip to content
This repository was archived by the owner on Nov 27, 2024. It is now read-only.

Commit a2f7b53

Browse files
committed
Add DevicePickerControl
1 parent fd5f4e8 commit a2f7b53

13 files changed

+343
-87
lines changed

OnnxStack.UI/App.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public App()
4141
builder.Services.AddTransient<UpdateUpscaleModelDialog>();
4242
builder.Services.AddSingleton<IModelFactory, ModelFactory>();
4343
builder.Services.AddSingleton<IDialogService, DialogService>();
44-
44+
builder.Services.AddSingleton<IDeviceService, DeviceService>();
4545
// Build App
4646
_applicationHost = builder.Build();
4747
}

OnnxStack.UI/Dialogs/UpdateModelDialog.xaml

Lines changed: 39 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
xmlns:userControls="clr-namespace:OnnxStack.UI.UserControls"
88
mc:Ignorable="d"
99
Name="UI"
10+
MinWidth="1200"
11+
MaxWidth="1200"
1012
Icon="/Images/Icon.png"
1113
SizeToContent="WidthAndHeight"
1214
WindowStartupLocation="CenterOwner"
@@ -27,16 +29,16 @@
2729

2830
<UniformGrid Columns="3" Margin="0,5,0,0">
2931

30-
<StackPanel Margin="0,0,4,0">
32+
<StackPanel>
3133
<TextBlock Text="Pipeline" />
3234
<ComboBox ItemsSource="{Binding Source={StaticResource DiffuserPipelineType}}" SelectedItem="{Binding UpdateModelSet.PipelineType}" />
3335
</StackPanel>
3436

35-
<StackPanel Margin="0,0,4,0">
37+
<StackPanel Margin="4,0">
3638
<TextBlock Text="Model Type" />
3739
<ComboBox ItemsSource="{Binding Source={StaticResource ModelType}}" SelectedItem="{Binding UpdateModelSet.ModelType}" />
3840
</StackPanel>
39-
<StackPanel Margin="0,0,4,0">
41+
<StackPanel >
4042
<TextBlock Text="Sample Size" />
4143
<TextBox Text="{Binding UpdateModelSet.SampleSize}" />
4244
</StackPanel>
@@ -53,40 +55,35 @@
5355
</GroupBox>
5456

5557
<GroupBox Header="Performance" Margin="5,0" >
56-
<UniformGrid Columns="2" Margin="5">
57-
58-
<StackPanel Margin="0,0,4,0">
59-
<TextBlock Text="Execution Provider" />
60-
<ComboBox ItemsSource="{Binding UISettings.SupportedExecutionProviders}" SelectedItem="{Binding UpdateModelSet.ExecutionProvider}" />
58+
<StackPanel Margin="5">
59+
<StackPanel Margin="0,0,4,0">
60+
<TextBlock Text="Device" />
61+
<userControls:DevicePickerControl
62+
UISettings="{Binding UISettings}"
63+
DeviceId="{Binding UpdateModelSet.DeviceId, Mode=TwoWay}"
64+
ExecutionProvider="{Binding UpdateModelSet.ExecutionProvider, Mode=TwoWay}" />
6165
</StackPanel>
62-
<TextBlock />
63-
<StackPanel Margin="0,0,4,0">
66+
<StackPanel Margin="0,4,0,0">
6467
<TextBlock Text="Mode" />
6568
<ComboBox ItemsSource="{Binding Source={StaticResource ExecutionModeType}}" SelectedItem="{Binding UpdateModelSet.ExecutionMode}" />
6669
</StackPanel>
67-
<StackPanel Margin="0,0,4,0">
68-
<DockPanel>
69-
<TextBlock DockPanel.Dock="Left" Text="DeviceId" />
70-
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
71-
</DockPanel>
72-
<TextBox Text="{Binding UpdateModelSet.DeviceId}" />
73-
</StackPanel>
74-
<StackPanel Margin="0,0,4,0">
75-
<DockPanel>
76-
<TextBlock DockPanel.Dock="Left" Text="InterOp Threads" />
77-
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
78-
</DockPanel>
79-
<TextBox Text="{Binding UpdateModelSet.InterOpNumThreads}" />
80-
</StackPanel>
81-
82-
<StackPanel>
83-
<DockPanel>
84-
<TextBlock DockPanel.Dock="Left" Text="IntraOp Threads" />
85-
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
86-
</DockPanel>
87-
<TextBox Text="{Binding UpdateModelSet.IntraOpNumThreads}" />
88-
</StackPanel>
89-
</UniformGrid>
70+
<UniformGrid Columns="2" Margin="0,4,0,0">
71+
<StackPanel Margin="0,0,2,0">
72+
<DockPanel>
73+
<TextBlock DockPanel.Dock="Left" Text="InterOp Threads" />
74+
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
75+
</DockPanel>
76+
<TextBox Text="{Binding UpdateModelSet.InterOpNumThreads}" />
77+
</StackPanel>
78+
<StackPanel Margin="2,0,0,0">
79+
<DockPanel>
80+
<TextBlock DockPanel.Dock="Left" Text="IntraOp Threads" />
81+
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
82+
</DockPanel>
83+
<TextBox Text="{Binding UpdateModelSet.IntraOpNumThreads}" />
84+
</StackPanel>
85+
</UniformGrid>
86+
</StackPanel>
9087
</GroupBox>
9188

9289
<GroupBox Header="Advanced Settings" >
@@ -148,22 +145,20 @@
148145
</DockPanel>
149146

150147
<!--Override Defaults-->
151-
<UniformGrid Grid.Column="0" Columns="5" Visibility="{Binding IsOverrideEnabled, Converter={StaticResource BooleanToVisibilityConverter}}" Margin="0,5,0,10">
152-
<StackPanel Margin="0,0,4,0">
153-
<TextBlock Text="Provider" />
154-
<ComboBox ItemsSource="{Binding UISettings.SupportedExecutionProviders, ElementName=UI}" SelectedItem="{Binding ExecutionProvider}" />
148+
<UniformGrid Grid.Column="0" Columns="4" Visibility="{Binding IsOverrideEnabled, Converter={StaticResource BooleanToVisibilityConverter}}" Margin="0,5,0,10">
149+
<StackPanel Margin="0,0,4,0">
150+
<TextBlock Text="Device" />
151+
<userControls:DevicePickerControl
152+
UISettings="{Binding UISettings, ElementName=UI}"
153+
DeviceId="{Binding DeviceId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
154+
ExecutionProvider="{Binding ExecutionProvider, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
155155
</StackPanel>
156+
156157
<StackPanel Margin="0,0,4,0">
157158
<TextBlock Text="Mode" />
158159
<ComboBox ItemsSource="{Binding Source={StaticResource ExecutionModeType}}" SelectedItem="{Binding ExecutionMode}" />
159160
</StackPanel>
160-
<StackPanel Margin="0,0,4,0">
161-
<DockPanel>
162-
<TextBlock DockPanel.Dock="Left" Text="DeviceId" />
163-
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
164-
</DockPanel>
165-
<TextBox Text="{Binding DeviceId, TargetNullValue=''}" />
166-
</StackPanel>
161+
167162
<StackPanel Margin="0,0,4,0">
168163
<DockPanel>
169164
<TextBlock DockPanel.Dock="Left" Text="InterOp Threads" />

OnnxStack.UI/Dialogs/UpdateUpscaleModelDialog.xaml

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,22 +74,20 @@
7474
<GroupBox Header="Performance" Margin="5,10,5,0" >
7575
<UniformGrid Columns="2" Margin="5">
7676

77-
<StackPanel Margin="0,0,4,0">
78-
<TextBlock Text="Execution Provider" />
79-
<ComboBox ItemsSource="{Binding UISettings.SupportedExecutionProviders}" SelectedItem="{Binding UpdateModelSet.ExecutionProvider}" />
77+
<StackPanel Margin="0,0,4,0">
78+
<TextBlock Text="Device" />
79+
<userControls:DevicePickerControl
80+
UISettings="{Binding UISettings}"
81+
DeviceId="{Binding UpdateModelSet.DeviceId, Mode=TwoWay}"
82+
ExecutionProvider="{Binding UpdateModelSet.ExecutionProvider, Mode=TwoWay}" />
8083
</StackPanel>
84+
8185
<TextBlock />
8286
<StackPanel Margin="0,0,4,0">
8387
<TextBlock Text="Mode" />
8488
<ComboBox ItemsSource="{Binding Source={StaticResource ExecutionModeType}}" SelectedItem="{Binding UpdateModelSet.ExecutionMode}" />
8589
</StackPanel>
86-
<StackPanel>
87-
<DockPanel>
88-
<TextBlock DockPanel.Dock="Left" Text="DeviceId" />
89-
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
90-
</DockPanel>
91-
<TextBox Text="{Binding UpdateModelSet.DeviceId}" />
92-
</StackPanel>
90+
9391
<StackPanel Margin="0,0,4,0">
9492
<DockPanel>
9593
<TextBlock DockPanel.Dock="Left" Text="InterOp Threads" />

OnnxStack.UI/Models/DeviceInfo.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
namespace OnnxStack.UI.Models
2+
{
3+
public record DeviceInfo(string Name, int DeviceId, int VRAM);
4+
}

OnnxStack.UI/Models/OnnxStackUIConfig.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,28 +14,27 @@ public class OnnxStackUIConfig : IConfigSection
1414
public int DefaultIntraOpNumThreads { get; set; }
1515
public ExecutionMode DefaultExecutionMode { get; set; }
1616
public ExecutionProvider DefaultExecutionProvider { get; set; }
17-
public IEnumerable<ExecutionProvider> SupportedExecutionProviders => GetSupportedExecutionProviders();
17+
public ExecutionProvider SupportedExecutionProvider => GetSupportedExecutionProvider();
1818
public ObservableCollection<UpscaleModelSetViewModel> UpscaleModelSets { get; set; } = new ObservableCollection<UpscaleModelSetViewModel>();
1919
public ObservableCollection<StableDiffusionModelSetViewModel> StableDiffusionModelSets { get; set; } = new ObservableCollection<StableDiffusionModelSetViewModel>();
2020

2121

22-
public IEnumerable<ExecutionProvider> GetSupportedExecutionProviders()
22+
public ExecutionProvider GetSupportedExecutionProvider()
2323
{
2424
#if DEBUG_CUDA || RELEASE_CUDA
25-
yield return ExecutionProvider.Cuda;
25+
return ExecutionProvider.Cuda;
2626
#elif DEBUG_TENSORRT || RELEASE_TENSORRT
27-
yield return ExecutionProvider.TensorRT;
27+
return ExecutionProvider.TensorRT;
2828
#else
29-
yield return ExecutionProvider.DirectML;
29+
return ExecutionProvider.DirectML;
3030
#endif
31-
yield return ExecutionProvider.Cpu;
3231
}
3332

3433
public void Initialize()
3534
{
36-
DefaultExecutionProvider = SupportedExecutionProviders.Contains(DefaultExecutionProvider)
35+
DefaultExecutionProvider = DefaultExecutionProvider == SupportedExecutionProvider || DefaultExecutionProvider == ExecutionProvider.Cpu
3736
? DefaultExecutionProvider
38-
: SupportedExecutionProviders.First();
37+
: SupportedExecutionProvider;
3938
}
4039

4140
}

OnnxStack.UI/OnnxStack.Adapter.dll

89.5 KB
Binary file not shown.

OnnxStack.UI/OnnxStack.UI.csproj

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
<PlatformTarget>x64</PlatformTarget>
1111
<Configurations>Debug;Release;Debug-Cuda;Debug-TensorRT;Release-Cuda;Release-TensorRT</Configurations>
1212
<Platforms>x64</Platforms>
13+
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
1314
</PropertyGroup>
1415

1516
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release-Cuda|x64'">
@@ -39,7 +40,6 @@
3940
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
4041
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
4142
</Content>
42-
<None Include="..\OnnxStack.Adapter\x64\Debug\OnnxStack.Adapter.dll" Link="OnnxStack.Adapter.dll" />
4343
<Resource Include="Fonts\fa-brands-400.ttf" />
4444
<Resource Include="Fonts\fa-duotone-900.ttf" />
4545
<Resource Include="Fonts\fa-light-300.ttf" />
@@ -69,4 +69,10 @@
6969
<PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.77" />
7070
</ItemGroup>
7171

72+
<ItemGroup>
73+
<None Update="OnnxStack.Adapter.dll">
74+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
75+
</None>
76+
</ItemGroup>
77+
7278
</Project>
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
using OnnxStack.UI.Models;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Runtime.CompilerServices;
6+
using System.Runtime.InteropServices;
7+
8+
namespace OnnxStack.UI.Services
9+
{
10+
public class DeviceService : IDeviceService
11+
{
12+
private IReadOnlyList<DeviceInfo> _devices;
13+
14+
public DeviceService()
15+
{
16+
_devices = GetDevices();
17+
}
18+
19+
public IReadOnlyList<DeviceInfo> Devices => _devices;
20+
21+
private static IReadOnlyList<DeviceInfo> GetDevices()
22+
{
23+
var devices = new List<DeviceInfo> { new DeviceInfo("CPU", -1, 0) };
24+
25+
try
26+
{
27+
var adapters = new AdapterInfo[10];
28+
AdapterInterop.GetAdapters(adapters);
29+
devices.AddRange(adapters
30+
.Where(x => x.DeviceId > 0)
31+
.Select(GetDeviceInfo)
32+
.ToList());
33+
}
34+
catch (Exception ex)
35+
{
36+
devices.Add(new DeviceInfo("GPU0", 0, 0));
37+
devices.Add(new DeviceInfo("GPU1", 1, 0));
38+
}
39+
return devices;
40+
}
41+
42+
private static DeviceInfo GetDeviceInfo(AdapterInfo adapter)
43+
{
44+
string description = string.Empty;
45+
unsafe
46+
{
47+
description = new string(adapter.Description);
48+
}
49+
var deviceId = (int)adapter.Id;
50+
var vram = (int)(adapter.DedicatedVideoMemory / 1024 / 1024);
51+
return new DeviceInfo(description, deviceId, vram);
52+
}
53+
}
54+
55+
public static partial class AdapterInterop
56+
{
57+
[LibraryImport("OnnxStack.Adapter.dll")]
58+
[UnmanagedCallConv(CallConvs = new Type[] { typeof(CallConvCdecl) })]
59+
public static partial int GetAdapter([MarshalAs(UnmanagedType.Bool)] bool preferHighPerformance);
60+
61+
[LibraryImport("OnnxStack.Adapter.dll")]
62+
[UnmanagedCallConv(CallConvs = new Type[] { typeof(CallConvCdecl) })]
63+
public static partial void GetAdapters(AdapterInfo[] adapterArray);
64+
}
65+
66+
[StructLayout(LayoutKind.Sequential)]
67+
public unsafe struct AdapterInfo
68+
{
69+
public uint Id;
70+
public uint VendorId;
71+
public uint DeviceId;
72+
public uint SubSysId;
73+
public uint Revision;
74+
public ulong DedicatedVideoMemory;
75+
public ulong DedicatedSystemMemory;
76+
public ulong SharedSystemMemory;
77+
public Luid AdapterLuid;
78+
public fixed char Description[128];
79+
}
80+
81+
[StructLayout(LayoutKind.Sequential)]
82+
public struct Luid
83+
{
84+
public uint LowPart;
85+
public int HighPart;
86+
}
87+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System.Collections.Generic;
2+
using OnnxStack.UI.Models;
3+
4+
namespace OnnxStack.UI.Services
5+
{
6+
public interface IDeviceService
7+
{
8+
IReadOnlyList<DeviceInfo> Devices { get; }
9+
}
10+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<UserControl x:Class="OnnxStack.UI.UserControls.DevicePickerControl"
2+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
6+
mc:Ignorable="d" Name="UI">
7+
<DockPanel DataContext="{Binding ElementName=UI}">
8+
<ComboBox ItemsSource="{Binding Devices}" SelectedItem="{Binding SelectedDevice}">
9+
<ComboBox.ItemTemplate>
10+
<DataTemplate>
11+
<StackPanel Orientation="Horizontal">
12+
<TextBlock Text="{Binding Name}" />
13+
<TextBlock Text="{Binding UISettings.SupportedExecutionProvider, ElementName=UI, StringFormat={}({0})}" Margin="6,1,0,0" FontSize="10" Opacity=".7" FontStyle="Italic" >
14+
<TextBlock.Style>
15+
<Style TargetType="{x:Type TextBlock}">
16+
<Setter Property="Visibility" Value="Visible" />
17+
<Style.Triggers>
18+
<DataTrigger Binding="{Binding Name}" Value="CPU">
19+
<Setter Property="Visibility" Value="Collapsed" />
20+
</DataTrigger>
21+
</Style.Triggers>
22+
</Style>
23+
</TextBlock.Style>
24+
</TextBlock>
25+
</StackPanel>
26+
</DataTemplate>
27+
</ComboBox.ItemTemplate>
28+
</ComboBox>
29+
</DockPanel>
30+
</UserControl>

0 commit comments

Comments
 (0)