class LlamaState: ObservableObject {
@Published var messageLog = ""
@Published var cacheCleared = false
+ let NS_PER_S = 1_000_000_000.0
private var llamaContext: LlamaContext?
private var defaultModelUrl: URL? {
}
func loadModel(modelUrl: URL?) throws {
- messageLog += "Loading model...\n"
if let modelUrl {
+ messageLog += "Loading model...\n"
llamaContext = try LlamaContext.create_context(path: modelUrl.path())
messageLog += "Loaded model \(modelUrl.lastPathComponent)\n"
} else {
- messageLog += "Could not locate model\n"
+ messageLog += "Load a model from the list below\n"
}
}
return
}
+ let t_start = DispatchTime.now().uptimeNanoseconds
await llamaContext.completion_init(text: text)
+ let t_heat_end = DispatchTime.now().uptimeNanoseconds
+ let t_heat = Double(t_heat_end - t_start) / NS_PER_S
+
messageLog += "\(text)"
- while await llamaContext.n_cur <= llamaContext.n_len {
+ while await llamaContext.n_cur < llamaContext.n_len {
let result = await llamaContext.completion_loop()
messageLog += "\(result)"
}
+
+ let t_end = DispatchTime.now().uptimeNanoseconds
+ let t_generation = Double(t_end - t_heat_end) / NS_PER_S
+ let tokens_per_second = Double(await llamaContext.n_len) / t_generation
+
await llamaContext.clear()
- messageLog += "\n\ndone\n"
+ messageLog += """
+ \n
+ Done
+ Heat up took \(t_heat)s
+ Generated \(tokens_per_second) t/s\n
+ """
}
func bench() async {
messageLog += await llamaContext.model_info() + "\n"
let t_start = DispatchTime.now().uptimeNanoseconds
- await llamaContext.bench(pp: 8, tg: 4, pl: 1) // heat up
+ let _ = await llamaContext.bench(pp: 8, tg: 4, pl: 1) // heat up
let t_end = DispatchTime.now().uptimeNanoseconds
- let t_heat = Double(t_end - t_start) / 1_000_000_000.0
+ let t_heat = Double(t_end - t_start) / NS_PER_S
messageLog += "Heat up time: \(t_heat) seconds, please wait...\n"
// if more than 5 seconds, then we're probably running on a slow device
Button("Send") {
sendText()
}
- .padding(8)
- .background(Color.blue)
- .foregroundColor(.white)
- .cornerRadius(8)
Button("Bench") {
bench()
}
- .padding(8)
- .background(Color.blue)
- .foregroundColor(.white)
- .cornerRadius(8)
Button("Clear") {
clear()
}
- .padding(8)
- .background(Color.blue)
- .foregroundColor(.white)
- .cornerRadius(8)
Button("Copy") {
UIPasteboard.general.string = llamaState.messageLog
}
- .padding(8)
- .background(Color.blue)
- .foregroundColor(.white)
- .cornerRadius(8)
- }
+ }.buttonStyle(.bordered)
- VStack {
+ VStack(alignment: .leading) {
DownloadButton(
llamaState: llamaState,
modelName: "TinyLlama-1.1B (Q4_0, 0.6 GiB)",
modelUrl: "https://huggingface.co/TheBloke/TinyLlama-1.1B-1T-OpenOrca-GGUF/resolve/main/tinyllama-1.1b-1t-openorca.Q4_0.gguf?download=true",
filename: "tinyllama-1.1b-1t-openorca.Q4_0.gguf"
)
- .font(.system(size: 12))
- .padding(.top, 4)
- .frame(maxWidth: .infinity, alignment: .leading)
DownloadButton(
llamaState: llamaState,
modelUrl: "https://huggingface.co/TheBloke/TinyLlama-1.1B-1T-OpenOrca-GGUF/resolve/main/tinyllama-1.1b-1t-openorca.Q8_0.gguf?download=true",
filename: "tinyllama-1.1b-1t-openorca.Q8_0.gguf"
)
- .font(.system(size: 12))
DownloadButton(
llamaState: llamaState,
modelUrl: "https://huggingface.co/ggml-org/models/resolve/main/tinyllama-1.1b/ggml-model-f16.gguf?download=true",
filename: "tinyllama-1.1b-f16.gguf"
)
- .font(.system(size: 12))
- .frame(maxWidth: .infinity, alignment: .leading)
DownloadButton(
llamaState: llamaState,
modelUrl: "https://huggingface.co/ggml-org/models/resolve/main/phi-2/ggml-model-q4_0.gguf?download=true",
filename: "phi-2-q4_0.gguf"
)
- .font(.system(size: 12))
DownloadButton(
llamaState: llamaState,
modelUrl: "https://huggingface.co/ggml-org/models/resolve/main/phi-2/ggml-model-q8_0.gguf?download=true",
filename: "phi-2-q8_0.gguf"
)
- .font(.system(size: 12))
- .frame(maxWidth: .infinity, alignment: .leading)
DownloadButton(
llamaState: llamaState,
modelUrl: "https://huggingface.co/TheBloke/Mistral-7B-v0.1-GGUF/resolve/main/mistral-7b-v0.1.Q4_0.gguf?download=true",
filename: "mistral-7b-v0.1.Q4_0.gguf"
)
- .font(.system(size: 12))
Button("Clear downloaded models") {
ContentView.cleanupModelCaches()
llamaState.cacheCleared = true
}
- .padding(8)
- .font(.system(size: 12))
}
+ .padding(.top, 4)
+ .font(.system(size: 12))
+ .frame(maxWidth: .infinity, alignment: .leading)
}
.padding()
}