Skip to content
This repository has been archived by the owner on Feb 13, 2025. It is now read-only.

Commit

Permalink
Add platform arguments to benchmarks (#654)
Browse files Browse the repository at this point in the history
* Add platform argument to benchmarks

* Lint

* Make device selection more explicit

* Add default platform
  • Loading branch information
texasmichelle authored Aug 11, 2020
1 parent 0666a72 commit 3e83532
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 13 deletions.
37 changes: 33 additions & 4 deletions BenchmarksCore/BenchmarkArguments.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,23 +28,38 @@ public struct BenchmarkArguments: ParsableArguments {
@Flag(help: "Use X10 backend.")
var x10: Bool = false

@Flag(help: "Use CPU platform.")
var cpu: Bool = false

@Flag(help: "Use GPU platform.")
var gpu: Bool = false

@Flag(help: "Use TPU platform.")
var tpu: Bool = false

@Flag(help: "Use synthetic data.")
var synthetic: Bool = false
var synthetic: Bool = false

@Flag(help: "Use real data.")
var real: Bool = false
var real: Bool = false

@Option(help: "File path for dataset loading.")
var datasetFilePath: String?

public init() {}

public init(arguments: Benchmark.BenchmarkArguments, batchSize: Int?, eager: Bool, x10: Bool,
synthetic: Bool, real: Bool, datasetFilePath: String?) {
public init(
arguments: Benchmark.BenchmarkArguments, batchSize: Int?, eager: Bool, x10: Bool,
cpu: Bool, gpu: Bool, tpu: Bool, synthetic: Bool, real: Bool,
datasetFilePath: String?
) {
self.arguments = arguments
self.batchSize = batchSize
self.eager = eager
self.x10 = x10
self.cpu = cpu
self.gpu = gpu
self.tpu = tpu
self.synthetic = synthetic
self.real = real
self.datasetFilePath = datasetFilePath
Expand All @@ -62,6 +77,11 @@ public struct BenchmarkArguments: ParsableArguments {
throw ValidationError(
"Can't specify both --eager and --x10 backends.")
}

guard !(cpu && gpu) || !(cpu && tpu) || !(gpu && tpu) else {
throw ValidationError(
"Can't specify multiple platforms.")
}
}

public var settings: [BenchmarkSetting] {
Expand All @@ -76,6 +96,15 @@ public struct BenchmarkArguments: ParsableArguments {
if eager {
settings.append(Backend(.eager))
}
if cpu {
settings.append(Platform(.cpu))
}
if gpu {
settings.append(Platform(.gpu))
}
if tpu {
settings.append(Platform(.tpu))
}
if synthetic {
settings.append(Synthetic(true))
}
Expand Down
52 changes: 43 additions & 9 deletions BenchmarksCore/BenchmarkSettings.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,51 +47,84 @@ public struct Backend: BenchmarkSetting {
}
}

public struct Platform: BenchmarkSetting {
var value: Value
init(_ value: Value) {
self.value = value
}
public enum Value {
case `default`
case cpu
case gpu
case tpu
}
}

public struct DatasetFilePath: BenchmarkSetting {
var value: String
init(_ value: String) {
self.value = value
}
}

public extension BenchmarkSettings {
var batchSize: Int? {
extension BenchmarkSettings {
public var batchSize: Int? {
return self[BatchSize.self]?.value
}

var length: Int? {
public var length: Int? {
return self[Length.self]?.value
}

var synthetic: Bool {
public var synthetic: Bool {
if let value = self[Synthetic.self]?.value {
return value
} else {
fatalError("Synthetic setting must have a default.")
}
}

var backend: Backend.Value {
public var backend: Backend.Value {
if let value = self[Backend.self]?.value {
return value
} else {
fatalError("Backend setting must have a default.")
}
}

var device: Device {
public var platform: Platform.Value {
if let value = self[Platform.self]?.value {
return value
} else {
fatalError("Platform setting must have a default.")
}
}

public var device: Device {
// Note: The line is needed, or all GPU memory
// will be exhausted on initial allocation of the model.
// TODO: Remove the following tensor workaround when above is fixed.
let _ = _ExecutionContext.global

switch backend {
case .eager: return Device.defaultTFEager
case .x10: return Device.defaultXLA
case .eager:
switch platform {
case .default: return Device.defaultTFEager
case .cpu: return Device(kind: .CPU, ordinal: 0, backend: .TF_EAGER)
case .gpu: return Device(kind: .GPU, ordinal: 0, backend: .TF_EAGER)
case .tpu: fatalError("TFEager is unsupported on TPU.")
}
case .x10:
switch platform {
case .default: return Device.defaultXLA
case .cpu: return Device(kind: .CPU, ordinal: 0, backend: .XLA)
case .gpu: return Device(kind: .GPU, ordinal: 0, backend: .XLA)
case .tpu: return (Device.allDevices.filter { $0.kind == .TPU }).first!
}
}
}

var datasetFilePath: String? {
public var datasetFilePath: String? {
return self[DatasetFilePath.self]?.value
}
}
Expand All @@ -100,6 +133,7 @@ public let defaultSettings: [BenchmarkSetting] = [
TimeUnit(.s),
InverseTimeUnit(.s),
Backend(.eager),
Platform(.default),
Synthetic(false),
Columns([
"name",
Expand Down

0 comments on commit 3e83532

Please sign in to comment.