@@ -18,12 +18,9 @@ class RunnerHolder: ObservableObject {
18
18
19
19
extension UIImage {
20
20
func resized( to newSize: CGSize ) -> UIImage {
21
- let format = UIGraphicsImageRendererFormat . default ( )
22
- let renderer = UIGraphicsImageRenderer ( size: newSize, format: format)
23
- let image = renderer. image { _ in
21
+ UIGraphicsImageRenderer ( size: newSize) . image { _ in
24
22
draw ( in: CGRect ( origin: . zero, size: newSize) )
25
23
}
26
- return image
27
24
}
28
25
29
26
func toRGBArray( ) -> [ UInt8 ] ? {
@@ -71,10 +68,10 @@ extension UIImage {
71
68
let g = UInt8 ( pixelData [ pixelIndex + 1 ] )
72
69
let b = UInt8 ( pixelData [ pixelIndex + 2 ] )
73
70
74
- let rgbIndex = ( y * width + x)
71
+ let rgbIndex = ( y * width + x) * 3
75
72
rgbArray [ rgbIndex] = r
76
- rgbArray [ rgbIndex + height * width ] = g
77
- rgbArray [ rgbIndex + 2 * height * width ] = b
73
+ rgbArray [ rgbIndex + 1 ] = g
74
+ rgbArray [ rgbIndex + 2 ] = b
78
75
}
79
76
}
80
77
@@ -207,33 +204,34 @@ struct ContentView: View {
207
204
}
208
205
}
209
206
. navigationBarTitle ( title, displayMode: . inline)
210
- . navigationBarItems ( leading:
211
- Button ( action: {
212
- showingSettings. toggle ( )
213
- } ) {
214
- Image ( systemName: " gearshape " )
215
- . imageScale ( . large)
216
- } )
217
- . navigationBarItems ( trailing:
218
- HStack {
219
- Menu {
220
- Section ( header: Text ( " Memory " ) ) {
221
- Text ( " Used: \( resourceMonitor. usedMemory) Mb " )
222
- Text ( " Available: \( resourceMonitor. availableMemory) Mb " )
223
- }
224
- } label: {
225
- Text ( " \( resourceMonitor. usedMemory) Mb " )
226
- }
227
- . onAppear {
228
- resourceMonitor. start ( )
229
- }
230
- . onDisappear {
231
- resourceMonitor. stop ( )
232
- }
233
- Button ( action: { showingLogs = true } ) {
234
- Image ( systemName: " list.bullet.rectangle " )
235
- }
236
- }
207
+ . navigationBarItems (
208
+ leading:
209
+ Button ( action: {
210
+ showingSettings. toggle ( )
211
+ } ) {
212
+ Image ( systemName: " gearshape " )
213
+ . imageScale ( . large)
214
+ } ,
215
+ trailing:
216
+ HStack {
217
+ Menu {
218
+ Section ( header: Text ( " Memory " ) ) {
219
+ Text ( " Used: \( resourceMonitor. usedMemory) Mb " )
220
+ Text ( " Available: \( resourceMonitor. usedMemory) Mb " )
221
+ }
222
+ } label: {
223
+ Text ( " \( resourceMonitor. usedMemory) Mb " )
224
+ }
225
+ . onAppear {
226
+ resourceMonitor. start ( )
227
+ }
228
+ . onDisappear {
229
+ resourceMonitor. stop ( )
230
+ }
231
+ Button ( action: { showingLogs = true } ) {
232
+ Image ( systemName: " list.bullet.rectangle " )
233
+ }
234
+ }
237
235
)
238
236
. sheet ( isPresented: $showingLogs) {
239
237
NavigationView {
@@ -274,20 +272,24 @@ struct ContentView: View {
274
272
isGenerating = true
275
273
shouldStopGenerating = false
276
274
shouldStopShowingToken = false
277
- let text = prompt
275
+ let text = prompt. trimmingCharacters ( in : . whitespacesAndNewlines )
278
276
let seq_len = 768 // text: 256, vision: 768
279
277
let modelPath = resourceManager. modelPath
280
278
let tokenizerPath = resourceManager. tokenizerPath
281
- let useLlama = modelPath. range ( of : " llama " , options : . caseInsensitive ) != nil
279
+ let useLlama = modelPath. lowercased ( ) . contains ( " llama " )
282
280
283
281
prompt = " "
284
282
hideKeyboard ( )
285
283
showingSettings = false
286
284
285
+ messages. append ( Message ( text: text) )
286
+ messages. append ( Message ( type: useLlama ? . llamagenerated : . llavagenerated) )
287
+
287
288
runnerQueue. async {
288
289
defer {
289
290
DispatchQueue . main. async {
290
291
isGenerating = false
292
+ selectedImage = nil
291
293
}
292
294
}
293
295
@@ -299,10 +301,7 @@ struct ContentView: View {
299
301
300
302
guard !shouldStopGenerating else { return }
301
303
if useLlama {
302
- messages. append ( Message ( text: text) )
303
- messages. append ( Message ( type: . llamagenerated) )
304
-
305
- if let runner = runnerHolder. runner, !runner. isloaded ( ) {
304
+ if let runner = runnerHolder. runner, !runner. isLoaded ( ) {
306
305
var error : Error ?
307
306
let startLoadTime = Date ( )
308
307
do {
@@ -332,10 +331,7 @@ struct ContentView: View {
332
331
}
333
332
}
334
333
} else {
335
- messages. append ( Message ( text: text) )
336
- messages. append ( Message ( type: . llavagenerated) )
337
-
338
- if let runner = runnerHolder. llavaRunner, !runner. isloaded ( ) {
334
+ if let runner = runnerHolder. llavaRunner, !runner. isLoaded ( ) {
339
335
var error : Error ?
340
336
let startLoadTime = Date ( )
341
337
do {
@@ -394,7 +390,7 @@ struct ContentView: View {
394
390
if token != llava_prompt {
395
391
if token == " </s> " {
396
392
shouldStopGenerating = true
397
- runnerHolder. runner ? . stop ( )
393
+ runnerHolder. llavaRunner ? . stop ( )
398
394
} else {
399
395
tokens. append ( token)
400
396
if tokens. count > 2 {
@@ -410,7 +406,7 @@ struct ContentView: View {
410
406
}
411
407
}
412
408
if shouldStopGenerating {
413
- runnerHolder. runner ? . stop ( )
409
+ runnerHolder. llavaRunner ? . stop ( )
414
410
}
415
411
}
416
412
}
@@ -421,7 +417,7 @@ struct ContentView: View {
421
417
try runnerHolder. runner? . generate ( llama3_prompt, sequenceLength: seq_len) { token in
422
418
423
419
NSLog ( " >>> token={ \( token) } " )
424
- if token != llama3_prompt && !shouldStopShowingToken {
420
+ if token != llama3_prompt {
425
421
// hack to fix the issue that extension/llm/runner/text_token_generator.h
426
422
// keeps generating after <|eot_id|>
427
423
if token == " <|eot_id|> " {
@@ -485,6 +481,7 @@ struct ContentView: View {
485
481
}
486
482
runnerQueue. async {
487
483
runnerHolder. runner = nil
484
+ runnerHolder. llavaRunner = nil
488
485
}
489
486
switch pickerType {
490
487
case . model:
0 commit comments